質問
私は、画像aquisitionソフトウェアを開発しています。私は別のスレッド(簡単な画像キャプチャのためのライブビューを確保するため)に表示機能を実行したいです。今の私は、DisplayObjectを作成し、QThread :: moveToThread機能を使用して、QObjectをサブクラス化しています。問題は、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();
私は認めざるを忘れてしまった、それは仕事をしないことを...
解決
あなたは非UIスレッドでQImageのを使用することができます。これは、あなたがイメージに描画/キャプチャを行うことができるようになります。画像を表示する準備ができたら、あなたは、画像の信号を発することができました。あなたのUI要素がその画像を描画するために与えられた画像とリフレッシュ自体をとり、その信号に接続されたスロットを有していなければならない。
はシグナルとスロットを使用することにより、データは、スレッドセーフな方法で転送されるべきです。他のスレッドでQImagesを使用することにより、あなたが描くことができ、メインUIが作成されたイメージを更新するのではなく、それらの処理に多くの時間を過ごすための唯一の責任があります。
他のヒント
一般的にGUIは、メインスレッドで、すべての作業は、バックグラウンドスレッドで実行されます。
このハンドルのマウスにあるため、メインスレッドのニーズである、再描画、アイコン化イベントなど
はQtのいいところは、あなたがスレッド間のスロット/シグナルを送ることができるということです。
を参照してくださいスレッドにおけるQT の概要についてます。
新しい良いが、カバーをしてthreadignことはQt帳を進んでもあります詳細