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