2010-10-25 70 views
0

我正在开发图像采集软件。我想在单独的线程中运行显示功能(以确保实时查看以便于图像捕获)。现在我是继承QObject,创建DisplayObject并使用QThread :: moveToThread函数。问题是DisplayObject必须与GUI交互(图像需要在QGraphicsView对象中显示)。什么是最好的(也是最优雅的)方法呢?QThread与GUI的交互

我目前的解决方案:

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

这段代码的范围是什么:DisplayObject Displayer; Displayer.addDetectorSystem(PGRSystem); Displayer.connectGui(this); QThread线程; Displayer.moveToThread(&thread); (this,SIGNAL(display()),&Displayer,SLOT(display())); thread.start(); – 2010-10-26 07:30:22

+0

这些初始化包含在ImageAquisition类构造函数(主GUI类)中。 – Marcin 2010-10-26 09:24:13

回答

2

可以在非UI线程使用的QImage涵盖threadign。这将允许您对图像进行捕捉/绘图。一旦图像准备好显示,您就可以随图像发出信号。你的用户界面元素应该有一个连接到该信号的槽,该槽接受给定的图像并刷新自己以绘制该图像。

通过使用信号和插槽,数据应该以线程安全的方式传输。通过在其他线程中使用QImages,您可以绘制,而主UI仅负责更新创建的图像,而不是花费大量时间处理它们。

+1

以下是Caleb所说的一个例子:http://qt-project.org/doc/qt-4.8/threads-mandelbrot.html – 2013-01-08 09:00:58

1

一般的GUI是主线程和任何工作都在后台线程中完成。
这是因为主线程需要处理鼠标,重绘,iconify事件等

关于Qt的好处是您可以在线程之间发送插槽/信号。

查看threading in qt的概述。

也有一个很好的新advanced Qt book,在详细