2012-01-18 35 views
0

我想創建一個由QWidget繼承的類的線程。其實,我嘗試過使用QThread進行多重繼承,但它失敗了,我想使用線程運行特定的成員函數。我怎樣才能做到這一點?有人有什麼主意嗎?如何爲QWidget繼承的類創建線程?

+0

它是如何「失敗」?構建錯誤?運行時錯誤? – 2012-01-18 15:18:40

+2

來自兩個QObject的多重繼承是一個禁忌。這是多重繼承中共同的祖先/鑽石問題的一個例子。 – hmn 2012-01-18 15:50:20

+0

@ joachim:構建錯誤:它會拋出以下錯誤:錯誤C2385:'連接'的模糊訪問可能是基於'QObject'的'連接' 1>或者可能是基於'QObject'的'連接' – joki 2012-01-19 04:42:42

回答

0

一個解決方案可能是使用嵌套類,其中您將傳遞一個指向常規窗口小部件類的指針,以及您從嵌套的run方法中需要的所有所有方法。

2

你可以用它實現了線程並調用Widget的方法的包裝類:

class MyWidget : public QWidget 
{ 
    [...] 

    void threadMethod(); 
}; 

class MyThread : public QThread 
{ 
    [...] 

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

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

    MyWidget* mWidget; 
}; 

但是,你不應該調用「threadMethod」任何QWidget的方法,因爲它的GUI和,因此部件屬於到「主」線程,並且QWidget方法不是線程安全的!

它可能會更好地保持您的小部件和線程代碼完全分開。

+0

謝謝hmn。但那是什麼「mWidget」站在這裏? – joki 2012-01-19 04:43:53

+0

「mWidget」是保存對小部件的引用的成員變量。爲了清楚起見,我在代碼示例中添加了它。 – hmn 2012-01-19 15:12:39

0

屬於GUI模塊的Qt類不可重入。它們必須從主線程運行。