1. 程式人生 > >Qt5 中的訊號/槽 connect新語法

Qt5 中的訊號/槽 connect新語法

Qt 5 之前的語法

在 Qt 5 之前,我們需要使用下面的語句來連結 signal 和 slot:

connect(sender, SIGNAL(valueChanged(QString, QString)), receiver, SLOT(updateValue(QString)));
12connect(sender,SIGNAL(valueChanged(QString,QString)),receiver,SLOT(updateValue(QString)));

Qt 實際上利用SIGNALSLOT這兩個巨集,把其後的函式名轉換成一個字串。隨後,moc 將會掃描全部檔案,將所有的 signal 和 slot 提取出來做成一個對映表。QObject::connect()

函式則會從這個對映表裡面找到該字串,從 signal 的名字就可以找到 slot 的名字,因此也就知道了在 signal emit 的時候,該去呼叫哪一個 slot 函式。

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);
12connect(sender,&Sender::valueChanged,receiver,&Receiver::updateValue);

這個看起來和之前的版本很類似,因此很容易遷移到新的語法。

【摘自】https://www.devbean.net/2012/04/signals-slots-in-qt5/