4

我有一个主要的 GUI 类和另一个 Worker 类:第一个处理 GUI 事物(将 a 绘制QPixmap到 a 中QGraphicsScene),第二个处理计算事物(将QLines 和QPoints 绘制到 that 上QPixmap)。这两个类在两个不同的线程中运行。当我创建Worker线程时,我将 GUI 的地址传递QPixmapWorker类,因此它们共享同一个对象。

在类QPixmap中修改,在Worker类中绘制GUI。即使我没有任何问题,我还是决定使用 a来确保我的程序在绘制时QMutex不会尝试访问。QPixmap现在,为了做到这一点,我QMutex在 GUI 类和类之间进行了共享WorkerWorker类又有一个指向 GUI 的指针QMutex)。QPixmap每当我阅读或修改QMutex.

这是一种有效的方法吗?到目前为止,我从未遇到过错误,但我想知道它在逻辑上是否正确以及 Qt 是否提供了更好的方法来实现这一点。

先感谢您。

4

2 回答 2

4

根据Qt5 线程安全页面

QPainter 可以在线程中用于在 QImage、QPrinter 和 QPicture 绘图设备上绘图。不支持在 QPixmaps 和 QWidgets 上绘画。

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

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

于 2015-11-25T01:49:21.710 回答
2

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

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

于 2018-01-03T09:38:07.207 回答