Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading QObject::killTimer:无法从另一个线程停止计时器_Multithreading_Qt_Qgraphicsview_Qtconcurrent - Fatal编程技术网

Multithreading QObject::killTimer:无法从另一个线程停止计时器

Multithreading QObject::killTimer:无法从另一个线程停止计时器,multithreading,qt,qgraphicsview,qtconcurrent,Multithreading,Qt,Qgraphicsview,Qtconcurrent,我在我的main窗口中有一个QGraphicsView,我在Ui中创建了它(当然是使用基本线程),我想从另一个线程在它上面设置一个qgraphicscene 因此,在main窗口的构造函数中,我有: MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ... connect(this,&MainWindow::graphSceneSignal,this,&M

我在我的
main窗口中有一个
QGraphicsView
,我在Ui中创建了它(当然是使用基本线程),我想从另一个线程在它上面设置一个
qgraphicscene

因此,在
main窗口的构造函数中,我有:

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);
...
}
void MainWindow::generateGraph()
{
    ...
    QPixmap p("myPix.png");
    QGraphicsScene* scene = new QGraphicsScene();
    scene->addPixmap(p);
    emit graphSceneSignal(scene);
    ...
}
main窗口::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);

进入
main window::graphSceneSlot

您收到此警告的原因是,您创建的场景仍然“存在”在创建它的并发线程中。这意味着无法从主线程对其进行正确的“控制”

为了使代码正常工作,必须将图形场景从并发线程“移动”到主线程。这可以通过以下方式实现:


您应该明确阅读更多关于Qt中线程和对象的内容。此链接将引导您进入文档,其中对其进行了更详细的解释:

您收到此警告的原因是,您创建的场景仍然“存在”在创建它的并发线程中。这意味着无法从主线程对其进行正确的“控制”

为了使代码正常工作,必须将图形场景从并发线程“移动”到主线程。这可以通过以下方式实现:

您应该明确阅读更多关于Qt中线程和对象的内容。此链接将引导您访问文档,其中将对其进行更详细的解释:

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);
    ...
}