从其他线程更新QT图形视图

Update QT Graphicview from other Thread

本文关键字:图形 视图 QT 更新 其他 线程      更新时间:2023-10-16

我现在真的很困惑QT中的线程。我读了很多不同的观点,我能意识到这一点。

我有一门课(Computations),它会进行大量计算并生成大量解决方案。当这个类找到解决方案时,我会在的帮助下调用

boost::function<void (Solution)> f;

自定义函数。可以与结合

f = boost::bind( &MainWindow::FoundSolution, this,_1);

不,我的主窗口在QT中。在那里,我把我的课叫做计算

Computations comp(f); 
QFuture<void> future = QtConcurrent::run(comp,&Computations::DoSomethink);

因此,当我可以使用GUI时,它会进行计算,并且我会在主窗口中获得新解决方案对FoundSolution函数的响应。在这个函数中,我使用QGraphicview来绘制我的解决方案。Qgraphicsview是我的主窗口的一个成员。

这有时有效。

但我经常得到以下错误

QCOREApplication::SendEvent:"无法将事件发送到对象通过不同的线程owend。当前线程438bc40。接受者"(类型为"Qgraphicscene")是在线程15dcc00中创建的,文件内核应用程序行494

这意味着我从非主线程调用GUI应用程序,这是QT禁止的。但随着我的助推绑定,我应该在我的主线上,还是?为什么它有时有效?

你知道更好的实现方法吗?我对QT和线程真的很陌生。

谢谢你的帮助。

如果从连接到ui线程中对象插槽的工作线程发出信号,则该插槽将在ui线程中执行。

因此,基本上,如果您想在QGraphicsView中绘制一个新点,请从您的工作线程发送一个信号,传递要绘制的新点的坐标。该信号需要连接到ui线程中的一个对象。然后,该槽将处理在QGraphicsView中绘制新点的操作,因为该槽是在ui线程中执行的。

有关更多信息,请参阅线程间的信号和插槽

实现这一点的正常方法是使用信号和插槽。你可以在这里找到一些针对你的问题的文档:问题4.8,问题5。

connect( &sender, SIGNAL(), &receiver, SLOT(), Qt::QueuedConnection)

更简单的修复方法是将Qt::QueuedConnection添加到有问题的插槽连接调用中。