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ù)類型