2011-06-06 66 views
1

這裏是我的問題QT繼承信號將不會達到插槽

class Base : QThread 
{ 
    Q_OBJECT 
virtual void run() = 0; 
signals: 
void Ping(int); 
}; 

class Derived : public Base 
{ 
    void run() 
    { 
    emit Ping(42); 
    } 
} 

的代碼信號(42)將不會到達/來電插槽。怎麼了? 在此先感謝。

回答

5

做了100次,它確實有效。你確定你的基類是正確的MOC? (即在包含在.pro的HEADERS部分中的文件中定義)。當連接你的信號時,檢查QObject::connect(它是一個布爾值)的返回狀態。一個好的做法是類似的東西

bool r=false; 
r=QObject::connect(pObj1,SIGNAL(signalStuff()),pObj2,SLOT(gotStuff())); 
Q_ASSERT(r); 

隨着莉斯發現,如果事情在你的connect出了問題,你可以檢查的痕跡就知道發生了什麼。

我還可以注意到:

  • 你沒有在你的基類來重新定義run,它已經通過QThread
  • 常見的陷阱與QThread定義:基類和派生類屬於線程而不是在新創建的線程
  • 你不把你的信號連接到你的示例中的任何插槽,所以它不會觸發任何東西(我想它是在別處完成的)
  • 你的類派生d缺乏最終;

編輯

編輯,以兼顧Liz的有趣評論。

+1

(不值得一個單獨的答案)檢查你的程序的輸出。如果連接調用有問題,Qt會將錯誤轉儲到控制檯窗口。有時候就像打字錯誤一樣簡單。 – Liz 2011-06-06 22:06:02

+0

該死的真的,編輯我的文章,以考慮到這一點,thx利茲 – Bruce 2011-06-07 05:22:34

0

我認爲你試圖從不同的線程連接信號和插槽。 你讀過this article嗎?

0

我遇到了同樣的問題,但設法找到解決辦法。在我的情況下,問題不是繼承(即使我從派生類發出)。

問題是代碼調用發射信號被執行之前代碼連接信號插槽。因此,兩個信號都被髮射出來,信號插槽連接正常工作,但插槽中的代碼沒有執行,因爲在將插槽連接到信號之前發生了發射。

也許這對未來有幫助。