メインフォームをQt Designerにして、QMainWindow
とUIを継承しました。私は他のスレッドを実行する必要がありますし、メインフォーム上のもの、例えばプログレスバー、LCDを変更するにはそれらのスレッドが必要です。メンバであるQThreadからQMainWindowのQt GUIウィジェットを変更するにはどうすればよいですか?
他のスレッドにメインフォームのウィジェットへのアクセスを許可するにはどうすればよいですか?
ありがとうございました。
メインフォームをQt Designerにして、QMainWindow
とUIを継承しました。私は他のスレッドを実行する必要がありますし、メインフォーム上のもの、例えばプログレスバー、LCDを変更するにはそれらのスレッドが必要です。メンバであるQThreadからQMainWindowのQt GUIウィジェットを変更するにはどうすればよいですか?
他のスレッドにメインフォームのウィジェットへのアクセスを許可するにはどうすればよいですか?
ありがとうございました。
信号/スロットの使用。 Trolltechは、connect()関数の Qt :: BlockingQueuedConnectionパラメータを使用して、シグナリング用のスレッドセーフメカニズムを4.xから導入しています。詳細について
参照: http://lists.trolltech.com/qt-interest/2007-03/thread00260-0.html
をFlaviusのSuciuが述べたように、あなたは、クロススレッド信号/スロット接続を使用することができます。彼らはまた、引数を運ぶことができるあなただけの基本的な種類やQtのタイプ信号パラメータとしてではなく、たとえば、独自のカスタムstruct
に合格しない場合しかし、あなたはそれらについて、このようにQtのを伝える必要があります:
namespace MyNamespace { // if any...
struct MyClass { /* ... */ };
} // if any
Q_DECLARE_METATYPE(MyNamespace::MyClass)
このMyClass
をQVariant
に埋め込むことができます。これは、Qtがシグナルの引数のコピーをスレッドの境界を超えて発送するために内部で使用するものです。
あなたはまた、任意のシグナル/スロットのクロススレッドの接続が試行される前に、それを実行するためにバインドされていますどこか
qRegisterMetaType<MyNamespace::MyClass>();
を呼び出す必要があります(例えばmain()
、またはあなたのQThread
サブクラスのコンストラクタで)。
は行くには良い方法のように思えるあなたの返信用Q_DECLARE_METATYPE
おかげで、のドキュメントを参照してください。私は信号とスロットを設定し、それらを接続しましたが、スロットは実行されていません。 私はFlavius Suciuが提供するリンクとまったく同じ問題を抱えているようです。 提案がありますか? –
'thread-> moveToThread(thread)'を使うことはできません。フラビウスのリンク先のように。あなたのスロットが呼び出されていなければ、おそらく 'connect()'が失敗しました。あなたはデバッグQtとリンクしていますか?接続が失敗したときに警告のみが表示されます。 –