別のスレッドからQDialogに影響を与えたいのですが、次の2つのことを行う必要があります。
dialog->show();
dialog->raise();
dialog->activateWindow();
私が理解している限り、これらはイベントであるため、メインスレッドのイベントループで実行する必要があります。QApplication::postEvent
私はこれを内で達成すると思いますQThread::run()
。誰か確認できますか?
次に、その別のスレッドで処理された画像を表示したいと思います。ダイアログクラスをサブクラス化し、スレッドセーフ関数を作成する必要があると思います。この関数は...setImage()
によって呼び出されpaintEvent()
ます。しかし、これは不可能のようです。QMutex::unlock()
?でpaintEventをブロックできません 誰かがいくつかの提案を提供できますか?
QApplication::postEvent(dialog, new QShowEvent());
動作しませんでした。
これは、別のスレッドから(関数として)スロットを呼び出すためのソリューションです。
QMetaObject::invokeMethod(dialog, "show", Qt::QueuedConnection);
QMetaObject::invokeMethod(dialog, "raise", Qt::QueuedConnection);
...まだ作業中でactivateWindow()
安全QThread
な機能。
したがって、のQImage
場合、これはQPaintDeviceです。おそらくそれはスレッドセーフです。私のアプローチはQImage
、スレッド内に設定されたクラスメンバーを持つことでした。その後、後でペイントします。
ただし、以下のアプローチも同様に優れていることに注意してください。