利用Qt進行程序開發時,有時需要信號槽來完成參數傳遞。帶參數的信號槽在使用時,有幾點需要注意的地方。
第一點:當信號與槽函數的參數數量相同時,它們參數類型要完全一致。
第二點:當信號的參數與槽函數的參數數量不同時。
1:當我們的槽函數參數比信號的參數多時,將會出現QObject::connect: Incompatible sender/receiver arguments錯誤。
2:當槽函數參數比信號參數少時,而且前面的參數類型一致時,從左往右數多出來的參數將會被忽視。
例如有信號
void signal_fun(int i,string s);
有槽函數
void slot_fun(int i,string s) { qDebug()<<"槽函數收到的參數為:"<<i<<s; }
鏈接起來
connect(this,SIGNAL(signal_fun(int,string)),this,SLOT(slot_fun(int,string)));
輸入代碼
emit signal_fun(123,"hello");
那么則會有輸出信息:槽函數收到的參數為123 hello。
除了傳遞實參,還可以用來傳遞形參:例如
void fun(int a,string str) { emit signal_fun(a,str); }
輸出的結果就是a和str所代表的參數值。
6.29補充:
槽函數和對應信號的connect應該放在這個對象被創建的文件中,而不是這個對象自身的源文件中
例如:有一個類A和他的槽函數slotA(),在另一個文件B中被創建,則他的connec應該寫在B的源文件中。
class A { private slots: void slotA(); }
B.cpp void fun() { A a;//創建一個A的具體對象 connect(this,SIGNAL(signal()),a,SLOT(slotA()));//不一定要寫在這個位置,但是一定要是在這個文件夾中,且connect的時間要在對象被創建之后 }
這樣才能生效,因為今天晚上在應用到友元類的時候發現將connect寫到A.cpp中的時候,槽函數不會被觸發,特此將問題記錄下來。