QObject::killTimer: Таймеры нельзя остановить из другого потока

У меня есть QGraphicsView в моем MainWindow, который я создал в своем пользовательском интерфейсе (конечно, с базовым потоком), и я хочу установить для него QGraphicsScene из другого потока.

Итак, в конструкторе MainWindow у меня есть:

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
...
connect(this,&MainWindow::graphSceneSignal,this,&MainWindow::graphSceneSlot);
...
QFuture<void> future;
future = QtConcurrent::run(this,&MainWindow::generateGraph);
...
}

а в MainWindow::generateGraph у меня есть:

void MainWindow::generateGraph()
{
    ...
    QPixmap p("myPix.png");
    QGraphicsScene* scene = new QGraphicsScene();
    scene->addPixmap(p);
    emit graphSceneSignal(scene);
    ...
}

а в MainWindow::graphSceneSlot есть:

void MainWindow::graphSceneSlot(QGraphicsScene* scene)
{
    ui->graph_graphicsView->setScene(scene);
    ui->graph_graphicsView->show();
}

Но возникает это предупреждение, которое я хочу решить:

QObject::killTimer: Timers cannot be stopped from another thread

так как?

ОБНОВЛЕНИЕ

Я могу решить это, переместив:

QPixmap p("myPix.png");
QGraphicsScene* scene = new QGraphicsScene();
scene->addPixmap(p);

в MainWindow::graphSceneSlot


person morteza ali ahmadi    schedule 09.05.2018    source источник


Ответы (1)


Причина, по которой вы получаете это предупреждение, заключается в том, что созданная вами сцена все еще «живет» в параллельном потоке, в котором она была создана. Это означает, что ею нельзя должным образом «управлять» из основного потока.

Потоки и объекты QObject

Чтобы ваш код работал правильно, графическая сцена должна быть «перемещена» из параллельного потока в основной поток. Это можно сделать с помощью QObject::moveToThread:

void MainWindow::generateGraph()
{
    ...
    QPixmap p("myPix.png");
    QGraphicsScene* scene = new QGraphicsScene();
    scene->addPixmap(p);
    scene->moveToThread(this->thread()); //this line here does the trick
    emit graphSceneSignal(scene);
    ...
}

Вам определенно следует больше узнать о потоках и объектах в Qt. Эта ссылка ведет к документации, где это объясняется более подробно: Threads и QObjects

person Felix    schedule 09.05.2018