QObject :: killTimer: таймеры нельзя остановить из другого потока - PullRequest
0 голосов
/ 09 мая 2018

У меня есть 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

1 Ответ

0 голосов
/ 09 мая 2018

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

Threads and QObjects

Чтобы ваш код функционировал должным образом, графическая сцена должна быть "перемещена" из параллельного потока в основной поток. Это можно сделать с помощью 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

...