我正在开发图像采集软件。我想在一个单独的线程中运行显示功能(以确保实时视图以便于图像捕获)。现在我正在继承QObject,创建DisplayObject并使用QThread :: moveToThread函数。问题是DisplayObject必须与GUI交互(图像需要在QGraphicsView对象中显示)。这样做的最好(也是最优雅)方式是什么?
我目前的解决方案:
class DisplayObject : public QObject
{
Q_OBJECT
public:
inline void addDetectorSystem(cci::PGR* system);
inline void connectGui(ImageAquisition* gui);
public slots:
void display();
private:
cci::PGR* camSystem;
ImageAquisition* guiClass;
};
DisplayObject初始化如下:
DisplayObject Displayer;
Displayer.addDetectorSystem(PGRSystem);
Displayer.connectGui(this);
QThread thread;
Displayer.moveToThread(&thread);
connect(this, SIGNAL(display()), &Displayer, SLOT(display()));
thread.start();
我忘了承认,它不起作用......
答案 0 :(得分:2)
您可以在非UI线程中使用QImage。这将允许您捕获/绘制图像。一旦准备好显示图像,您就可以用图像发出信号。您的UI元素应该有一个连接到该信号的插槽,该插槽将获取给定的图像并刷新自己以绘制该图像。
通过使用信号和插槽,数据应以线程安全的方式传输。通过在其他线程中使用QImages,您可以绘制,主UI仅负责更新创建的图像,而不是花费大量时间处理它们。
答案 1 :(得分:1)
通常,GUI是主线程,任何工作都是在后台线程中完成的 这是因为主线程需要处理鼠标,重绘,图标化事件等
关于Qt的好处是你可以在线程之间发送插槽/信号。
有关概述,请参阅threading in qt。
还有一个很好的新advanced Qt book详细介绍了threadign