0

我有一个 QTimer 用于执行 OpenCV 代码并每 20 毫秒更改 QLabel 中的图像,但我想更自然地运行这个 OpenCV 代码而不依赖于计时器。

相反,我希望有一个处理用户输入的主线程和另一个使用 OpenCV 处理图像的线程,我找不到一种线程安全的方法来从另一个线程更改一个线程中的 QLabel 图像(像素图),可以有人描述了这个过程,也许给出一些代码示例?我也想知道使用 QThread 的利弊,因为它是免费的平台,听起来是用户级线程,而不是通常运行更流畅的系统级。

4

1 回答 1

0

您只能QPixmap在应用程序的主(GUI)线程上实例化和使用(例如,返回的内容QApplication::instance()->thread()

这并不是说您不能在其他线程上使用 QPainter 和图形对象。大多数事情都有效,但操作系统施加的约束除外。

Qt 的后续版本已经设法找到支持以前不起作用的东西的方法。例如:

QPixmap注意:在 Qt 添加支持以在非 GUI 线程上工作的那一天,您不应该屏住呼吸。它们存在的原因是直接参与图形层;并找到一种方法来解决它,这样你就可以使用名为 QPixmap 的东西没有任何好处,因为那时你只是使用与已经存在的QBitmap.

因此,所有这些都与QFontQImage另一个线程上实例化图形对象的能力有关,并在QPainter调用中使用它们来生成图形图像。但是该图像不能直接绑定到显示的活动部分……您将始终在某些屏幕外缓冲区中进行绘制。它将必须安全地传递回主线程......这是所有直接到小部件绘图和鼠标事件等必须通过的网关。

Qt 的Mandelbrot Sample就是一个众所周知的例子。我建议您开始使用...确保您完全理解它。

注意:对于不同的技术,您可能有兴趣查看我对同一样本的Thinker-Qt重新构想。

于 2013-11-06T00:12:25.803 回答