2012-01-18 10 views
0

QWidgetによって継承されるクラス用のスレッドを作成したいとします。実際、QThreadで複数の継承を試してみましたが失敗し、スレッドを使って特定のメンバ関数を実行したいのです。どうすればこれを達成できますか?誰にも分かりますか?QWidgetに継承されているクラスのスレッドを作成する方法は?

+0

どのように失敗するのですか?ビルドエラー?ランタイムエラー? –

+2

2つのQObjectからの複数の継承は、no-noです。これは、複数の継承における共通の祖先/菱形問題の例です。 – hmn

+0

@ joachim:ビルドエラー:次のエラーが発生しました:エラーC2385: '接続'の曖昧なアクセス 1>ベース 'QObject'の '接続'になる可能性があります 1> 'QObject' – joki

答えて

0

通常のウィジェットクラスへのポインタとネストされた実行メソッドから必要なすべてのメソッドを渡すネストされたクラスを使用することができます。

2

あなたはスレッドを実装し、ウィジェットのメソッドを呼び出すラッパークラスを使用することができます。

class MyWidget : public QWidget 
{ 
    [...] 

    void threadMethod(); 
}; 

class MyThread : public QThread 
{ 
    [...] 

    MyThread(MyWidget* widget) 
     : mWidget(widget) 
    { 
    } 

    void run() 
    { 
     mWidget->threadMethod(); 
    } 

    MyWidget* mWidget; 
}; 

ただし、GUI以来、「threadMethod」のいずれかのQWidgetのメソッドを呼び出してはいけませんし、したがって、ウィジェットが属しています"main"スレッドに渡すと、QWidgetメソッドはスレッドセーフではありません!

ウィジェットとスレッドコードを完全に分離しておく方が良いでしょう。

+0

ありがとうhmn。しかし、「mWidget」は何を意味するのでしょうか? – joki

+0

"mWidget"は、ウィジェットへの参照を保持するメンバ変数です。わかりやすくするためにコード例に追加しました。 – hmn

0

GUIモジュールに属するQtクラスは、再入可能ではありません。それらはメインスレッドから実行されなければならない(MUST)。

関連する問題