Qt5 中的訊號/槽 connect新語法
阿新 • • 發佈:2019-01-01
Qt 5 之前的語法
在 Qt 5 之前,我們需要使用下面的語句來連結 signal 和 slot:
connect(sender, SIGNAL(valueChanged(QString, QString)), receiver, SLOT(updateValue(QString)));12 | connect(sender,SIGNAL(valueChanged(QString,QString)),receiver,SLOT(updateValue(QString))); |
Qt 實際上利用SIGNAL
和SLOT
這兩個巨集,把其後的函式名轉換成一個字串。隨後,moc 將會掃描全部檔案,將所有的 signal 和 slot 提取出來做成一個對映表。QObject::connect()
Qt 5 之前的 signal/slot 語法的問題
從上面的解釋可以看出,Qt 5 之前版本提供的這種語法其實有一些問題:
- 沒有編譯期檢查:因為函式名被處理成字串,所有的檢查都是在執行時完成的。這就是為什麼有時會發生編譯通過了,但 slot 並沒有被呼叫。此時,你就應該去檢查 console 的輸出,看看有沒有什麼 warning 說明 connect 並沒有成功。
- 因為處理的是字串,所以 slot 中的型別名字必須用 signal 的完全一致,而且在標頭檔案中的和實際 connect 語句中的也必須一致。也就是說,如果你使用了 typedef 或者 namespace,connect 就可能不成功(在 Qt 5 之前的版本中,我們當然也可以使用 namespace,但是必須保證標頭檔案中的和 connect 語句中的文字完全一致)。
新語法:使用函式指標
在 Qt5 提供了一套新的語法。之前的語法依然可以使用,但是現在,我們有了更好的選擇:
connect(sender, &Sender::valueChanged, receiver, &Receiver::updateValue);12 | connect(sender,&Sender::valueChanged,receiver,&Receiver::updateValue); |
這個看起來和之前的版本很類似,因此很容易遷移到新的語法。
【摘自】https://www.devbean.net/2012/04/signals-slots-in-qt5/