QObject :: killTimer:无法从另一个线程

时间:2018-05-09 05:48:24

标签: multithreading qt qgraphicsview qtconcurrent

我的QGraphicsView中有一个MainWindow我在我的Ui中创建了它(当然还有基本线程),我想从另一个线程中设置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 :(得分:3)

你收到此警告的原因是因为你创建的场景仍然生活在#34;在它创建的并发线程中。这意味着它无法正确地控制&#34;从主线程。

Threads and QObjects

为了使您的代码正常运行,必须移动图形场景&#34;从并发线程到主线程。这可以通过使用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 and QObjects