2018-10-26

Qt: 為什么程序編譯成功了,但信號和槽并沒有連接起來?

Qt信號和槽連接失敗的原因主要有一下幾點:

  • 槽函數(shù)并沒有在類的public slots(private slots\protected slots) 里。注意,如果沒有寫進類里面,槽函數(shù)只是個普通定義函數(shù),并不能將信號與槽連接起來,尤其使用ui添加槽函數(shù)的同學(xué)特別注意;
  • 信號和槽之間存在參數(shù)傳遞,但是二者的參數(shù)數(shù)量或者類型不一致(信號里的參數(shù)數(shù)量可以多于槽函數(shù)的參數(shù)數(shù)量,但是二者都有的參數(shù),類型必須對應(yīng));
  • 信號和槽之間有參數(shù)傳遞,但是使用connect的時候在槽函數(shù)或者信號或二者同時加入形參。如:
connect(sender, SIGNAL(sendMessage(int a)), receiver, SLOT(getMessage(int b))); //failed,連接有形參,故失敗。

connect(sender, SIGNAL(sendMessage(int)), receiver, SLOT(getMessage(int))); //success.
  • 信號和槽之間存在自定義參數(shù)傳遞,但是傳遞的類型沒有注冊。
    So,what's 自定義參數(shù)?在傳遞 int, double, cahr, bool, float類型的時候沒問題,但是傳遞比如QList類或者自定義的結(jié)構(gòu)體類等時,連接將會失,此時:
connect(this, SIGNAL(MoveToOnePoint(QList<double>)), robot, Slot(MoveToOnePoint(QList<double>)));
將會出現(xiàn)如下情況:
Object: connect: No such signal multiRobots::MoveToOnePoint.

此時需要注冊這種自定義類型,首先包含頭文件:

#include <QMetaType> //添加文件引用

在connect之前注冊:

qRegisterMetaType <QList<QString>>("QList<double>"); //注冊參數(shù)類型
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容