我有一个 QTimer 用于执行 OpenCV 代码并每 20 毫秒更改 QLabel 中的图像,但我想更自然地运行这个 OpenCV 代码而不依赖于计时器。
相反,我希望有一个处理用户输入的主线程和另一个使用 OpenCV 处理图像的线程,我找不到一种线程安全的方法来从另一个线程更改一个线程中的 QLabel 图像(像素图),可以有人描述了这个过程,也许给出一些代码示例?我也想知道使用 QThread 的利弊,因为它是免费的平台,听起来是用户级线程,而不是通常运行更流畅的系统级。
我有一个 QTimer 用于执行 OpenCV 代码并每 20 毫秒更改 QLabel 中的图像,但我想更自然地运行这个 OpenCV 代码而不依赖于计时器。
相反,我希望有一个处理用户输入的主线程和另一个使用 OpenCV 处理图像的线程,我找不到一种线程安全的方法来从另一个线程更改一个线程中的 QLabel 图像(像素图),可以有人描述了这个过程,也许给出一些代码示例?我也想知道使用 QThread 的利弊,因为它是免费的平台,听起来是用户级线程,而不是通常运行更流畅的系统级。
您只能QPixmap
在应用程序的主(GUI)线程上实例化和使用(例如,返回的内容QApplication::instance()->thread()
)
这并不是说您不能在其他线程上使用 QPainter 和图形对象。大多数事情都有效,但操作系统施加的约束除外。
Qt 的后续版本已经设法找到支持以前不起作用的东西的方法。例如:
QPixmap
注意:在 Qt 添加支持以在非 GUI 线程上工作的那一天,您不应该屏住呼吸。它们存在的原因是直接参与图形层;并找到一种方法来解决它,这样你就可以使用名为 QPixmap 的东西没有任何好处,因为那时你只是使用与已经存在的QBitmap
.
因此,所有这些都与QFont
在QImage
另一个线程上实例化图形对象的能力有关,并在QPainter
调用中使用它们来生成图形图像。但是该图像不能直接绑定到显示的活动部分……您将始终在某些屏幕外缓冲区中进行绘制。它将必须安全地传递回主线程......这是所有直接到小部件绘图和鼠标事件等必须通过的网关。
Qt 的Mandelbrot Sample就是一个众所周知的例子。我建议您开始使用...确保您完全理解它。
注意:对于不同的技术,您可能有兴趣查看我对同一样本的Thinker-Qt重新构想。