我有一个主GUI类和另一个Worker类:第一个处理GUI事物(将QPixmap
绘制成QGraphicsScene
),第二个计算事物(将QLine
s和QPoint
s绘制到QPixmap
上)。这两个类在两个不同的线程中运行。当我创建Worker
线程时,我将GUI的QPixmap
的地址传递给Worker
类,因此它们共享相同的对象。
QPixmap
在Worker
类中被修改,并在GUI
类中绘制。即使我没有任何问题,我决定使用QMutex
来确保我的程序在绘制时不会尝试访问QPixmap
。现在,为了做到这一点,我在GUI类和QMutex
类之间共享了一个Worker
(Worker
类再次指向GUI的QMutex
)。每当我阅读或修改QPixmap
时,我都会锁定QMutex
。
这是一种有效的方法吗?到目前为止我从未遇到任何错误,但我想知道它是否在逻辑上是正确的以及Qt是否提供了更好的方法来实现这一目标。
先感谢您。
QPainter可以在一个线程中用于绘制到QImage,QPrinter和QPicture绘图设备上。不支持在QPixmaps和QWidgets上绘画。
所以官方的不行,你不应该修改主线程之外的QPixmap。您可能“变得幸运”,因为它恰好在您当前的用例下在您当前的平台上工作,但Qt并不能保证它能够正常工作。
更安全的方法可能是让您的工作线程转换为QImage对象,然后当GUI线程想要更新GUI时,它可以抓取并绘制最新版本的QImage对象(使用互斥体或其他一些机制来制作确保工作线程没有同时更新QImage)。
我同意根据文档,不允许在工作线程中使用QPixmap。但是,根据代码。
构造函数检查它是否在主线程中。如果它不在主线程中,则会检查名为ThreadedPixmap的功能。如果启用,它将继续没有问题。据我所知,所有平台都支持ThreadedPixmap,因此似乎可以在其他线程上使用QPixmaps。