0

画像取得ソフトを開発しています。別のスレッドで表示機能を実行したい (画像を簡単にキャプチャできるようにライブ ビューを確保するため)。今のところ、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();

私はそれがうまくいかないことを認めるのを忘れていました...

4

2 に答える 2

2

非 UI スレッドで QImage を使用できます。これにより、画像へのキャプチャ/描画を行うことができます。画像を表示する準備ができたら、その画像で信号を送信できます。UI 要素には、その信号に接続されたスロットが必要です。この信号は、指定された画像を取得し、それ自体を更新してその画像を描画します。

シグナルとスロットを使用することで、スレッドセーフな方法でデータを転送する必要があります。他のスレッドで QImages を使用することにより、描画することができ、メイン UI は、作成された画像の処理に多くの時間を費やす代わりに、作成された画像の更新のみを担当します。

于 2010-10-26T15:37:54.207 に答える
1

通常、GUI はメイン スレッドであり、すべての作業はバックグラウンド スレッドで行われます。
これは、メイン スレッドがマウス、再描画、アイコン化イベントなどを処理する必要があるためです。

Qt の良いところは、スレッド間でスロット/シグナルを送信できることです。

概要については、qt のスレッド化を参照してください。

threadign を詳細にカバーする優れた新しい高度な Qt ブックもあります。

于 2010-10-25T13:59:01.050 に答える