Qt中线程间共享的像素图

Pixmap shared between threads in Qt

我有一个主 GUI class 和另一个 Worker class:第一个处理 GUI 的事情(将 QPixmap 绘制成 QGraphicsScene),其次是计算(在 QPixmap 上绘制 QLines 和 QPoints)。 两个 classes 运行 在两个不同的线程中。 当我创建 Worker 线程时,我将 GUI 的 QPixmap 的地址传递给 Worker class,因此它们共享同一个对象。

QPixmapWorkerclass修改,GUIclass绘制。即使没有任何问题,我还是决定使用 QMutex 来确保我的程序在绘制时不会尝试访问 QPixmap。现在,为了做到这一点,我在 GUI class 和 Worker class 之间共享了一个 QMutexWorker class 再次有一个指针到 GUI 的 QMutex)。每当我阅读或修改 QPixmap 时,我都会锁定 QMutex.

这是一种有效的方法吗?到目前为止我从来没有出错,但我想知道它在逻辑上是否正确以及 Qt 是否提供了更好的方法来完成这个。

提前谢谢你。

根据 Qt5 thread-safety page:

QPainter can be used in a thread to paint onto QImage, QPrinter, and QPicture paint devices. Painting onto QPixmaps and QWidgets is not supported.

所以官方说法是不,你不应该在主线程之外修改QPixmap。您可能 "getting lucky" 因为它恰好在您当前的用例下在您当前的平台上工作,但 Qt 不保证它会工作。

一个更安全的方法可能是让你的工作线程绘制到 QImage 对象中,然后当 GUI 线程想要更​​新 GUI 时,它可以获取并绘制最新版本的 QImage 对象(使用互斥锁或一些其他机制来确保工作线程不会同时更新 QImage)。

根据文档我同意,不允许在工作线程中使用 QPixmap。但是,根据代码。

构造函数检查它是否在主线程中。如果它不在主线程中,它会检查名为 ThreadedPixmap 的功能。如果启用,它将继续没有问题。据我所知,所有平台都支持 ThreadedPixmap,因此似乎可以在其他线程上使用 QPixmap。