4

リモートホストから画像を継続的に受信して画面に表示するアプリケーションを開発しています。このために、私は与えられた戦略に従っています 1) QImage を含むメインの QWidget オブジェクトがあります (正常に動作します) 2) リモートホストから受信した画像は QImage オブジェクトに描画されます。この作業は QPainter を使用してワーカースレッドで行われます。(正常に動作します) 3) しかし問題は、再描画イベントが QWidget に対して呼び出されるため、ウィジェットのサイズを変更しない限り、QWidget で画像が更新されないことです...今、ワーカー スレッドから QWidget を再描画すると、エラーが発生します " QPixmap: GUI スレッドの外でピックスマップを使用するのは安全ではありません」..そしてアプリケーションがクラッシュします。

これに関するヘルプはありますか?

4

3 に答える 3

2

プラグインを開発したい場合、qt には大きな問題があります。ホスト アプリケーションが非 qt アプリケーション (多くのプログラム...) で、2 つまたは 3 つの GUI プラグインを追加したい場合、(私のように) 大きな問題が発生します。

問題は、1 つのプロセスに QApplication が 1 つだけ存在する必要があることです。(通常はメインで行われます) プラグインを作成する場合、ホスト アプリケーションを QApplication.exec() でロックする余裕はありません。

この場合、run() 関数で QApplication と exec を使用して QThread を作成できます。正常に動作します。しかし、これは元の問題を解決することはできません。ホストプロセスにQApplicationがあるため、2番目のプラグインにはQApplicationがありません。(共有メモリに Qapplication ポインタを与えることはオプションではありません...QWidget は GUI スレッドで作成する必要があるため...常に 1 つです...)

そして、あなたの質問に対する答えはここにあります。プラグインを 1 つだけ作成する場合は、QMetaObject::invokeMethod を使用できます。このコードはピックスマップをラベルに設定し、GUI を更新します。

QImage img;... bool succ = QMetaObject::invokeMethod(mainWin, "DisplaySlot", Qt::QueuedConnection, Q_ARG(QImage, img));

public slot: を displayer ウィンドウに追加します。

void mainWinClass::DisplaySlot(QImage qim) { (*(ui.label)).setPixmap(QPixmap::fromImage(qim)); (*(ui.label)).update(); }

お役に立てば幸いです。

誰かが私の問題の解決策を知っている場合...上記(ホストアプリケーションでqtを使用した複数のGUIプラグイン)を教えてください。

于 2011-07-15T12:41:36.047 に答える
1

Qt では、メイン スレッド外での GUI 操作は許可されていません。すべての GUI 操作は、QApplication が存在するスレッドであるメイン スレッドで実行する必要があります。別のスレッドで GUI 操作を行うと、予期しない結果 (クラッシュなど) が発生します。

于 2009-10-02T07:50:32.663 に答える