這裏是我的問題QT繼承信號將不會達到插槽
class Base : QThread
{
Q_OBJECT
virtual void run() = 0;
signals:
void Ping(int);
};
class Derived : public Base
{
void run()
{
emit Ping(42);
}
}
的代碼信號(42)將不會到達/來電插槽。怎麼了? 在此先感謝。
這裏是我的問題QT繼承信號將不會達到插槽
class Base : QThread
{
Q_OBJECT
virtual void run() = 0;
signals:
void Ping(int);
};
class Derived : public Base
{
void run()
{
emit Ping(42);
}
}
的代碼信號(42)將不會到達/來電插槽。怎麼了? 在此先感謝。
做了100次,它確實有效。你確定你的基類是正確的MOC? (即在包含在.pro
的HEADERS部分中的文件中定義)。當連接你的信號時,檢查QObject::connect
(它是一個布爾值)的返回狀態。一個好的做法是類似的東西
bool r=false;
r=QObject::connect(pObj1,SIGNAL(signalStuff()),pObj2,SLOT(gotStuff()));
Q_ASSERT(r);
隨着莉斯發現,如果事情在你的connect
出了問題,你可以檢查的痕跡就知道發生了什麼。
我還可以注意到:
run
,它已經通過QThreadQThread
定義:基類和派生類屬於線程而不是在新創建的線程;
編輯:
編輯,以兼顧Liz的有趣評論。
我認爲你試圖從不同的線程連接信號和插槽。 你讀過this article嗎?
我遇到了同樣的問題,但設法找到解決辦法。在我的情況下,問題不是繼承(即使我從派生類發出)。
問題是代碼調用發射信號被執行之前代碼連接信號插槽。因此,兩個信號都被髮射出來,信號插槽連接正常工作,但插槽中的代碼沒有執行,因爲在將插槽連接到信號之前發生了發射。
也許這對未來有幫助。
(不值得一個單獨的答案)檢查你的程序的輸出。如果連接調用有問題,Qt會將錯誤轉儲到控制檯窗口。有時候就像打字錯誤一樣簡單。 – Liz 2011-06-06 22:06:02
該死的真的,編輯我的文章,以考慮到這一點,thx利茲 – Bruce 2011-06-07 05:22:34