2010-10-25 102 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,在詳細