2009-07-15 4 views
1

メインフォームをQt Designerにして、QMainWindowとUIを継承しました。私は他のスレッドを実行する必要がありますし、メインフォーム上のもの、例えばプログレスバー、LCDを変更するにはそれらのスレッドが必要です。メンバであるQThreadからQMainWindowのQt GUIウィジェットを変更するにはどうすればよいですか?

他のスレッドにメインフォームのウィジェットへのアクセスを許可するにはどうすればよいですか?

ありがとうございました。

+0

おかげで、のドキュメントを参照してください。私は信号とスロットを設定し、それらを接続しましたが、スロットは実行されていません。 私はFlavius Suciuが提供するリンクとまったく同じ問題を抱えているようです。 提案がありますか? –

+0

'thread-> moveToThread(thread)'を使うことはできません。フラビウスのリンク先のように。あなたのスロットが呼び出されていなければ、おそらく 'connect()'が失敗しました。あなたはデバッグQtとリンクしていますか?接続が失敗したときに警告のみが表示されます。 –

答えて

3

をFlaviusのSuciuが述べたように、あなたは、クロススレッド信号/スロット接続を使用することができます。彼らはまた、引数を運ぶことができるあなただけの基本的な種類やQtのタイプ信号パラメータとしてではなく、たとえば、独自のカスタムstructに合格しない場合しかし、あなたはそれらについて、このようにQtのを伝える必要があります:

namespace MyNamespace { // if any... 
    struct MyClass { /* ... */ }; 
} // if any 
Q_DECLARE_METATYPE(MyNamespace::MyClass) 

このMyClassQVariantに埋め込むことができます。これは、Qtがシグナルの引数のコピーをスレッドの境界を超えて発送するために内部で使用するものです。

あなたはまた、任意のシグナル/スロットのクロススレッドの接続が試行される前に、それを実行するためにバインドされていますどこか

qRegisterMetaType<MyNamespace::MyClass>(); 

を呼び出す必要があります(例えばmain()、またはあなたのQThreadサブクラスのコンストラクタで)。

は行くには良い方法のように思えるあなたの返信用Q_DECLARE_METATYPE