Qt: 為什么程序編譯成功了呀舔,但信號和槽并沒有連接起來僻爽?
Qt信號和槽連接失敗的原因主要有一下幾點(diǎn):
- 槽函數(shù)并沒有在類的
public slots
(private slots\protected slots) 里偏竟。注意庭惜,如果沒有寫進(jìn)類里面这揣,槽函數(shù)只是個(gè)普通定義函數(shù),并不能將信號與槽連接起來怀吻,尤其使用ui添加槽函數(shù)的同學(xué)特別注意瞬浓; - 信號和槽之間存在參數(shù)傳遞,但是二者的參數(shù)數(shù)量或者類型不一致(信號里的參數(shù)數(shù)量可以多于槽函數(shù)的參數(shù)數(shù)量烙博,但是二者都有的參數(shù)瑟蜈,類型必須對應(yīng));
- 信號和槽之間有參數(shù)傳遞渣窜,但是使用connect的時(shí)候在槽函數(shù)或者信號或二者同時(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類型的時(shí)候沒問題坝橡,但是傳遞比如QList類或者自定義的結(jié)構(gòu)體類等時(shí),連接將會(huì)失精置,此時(shí):
connect(this, SIGNAL(MoveToOnePoint(QList<double>)), robot, Slot(MoveToOnePoint(QList<double>)));
將會(huì)出現(xiàn)如下情況:
Object: connect: No such signal multiRobots::MoveToOnePoint.
此時(shí)需要注冊這種自定義類型计寇,首先包含頭文件:
#include <QMetaType> //添加文件引用
在connect之前注冊:
qRegisterMetaType <QList<QString>>("QList<double>"); //注冊參數(shù)類型