QT - QOverload說明及示例

Cosh1nE發表於2024-12-06

在QT中,通常我們建立訊號槽時訊號和槽傳遞的引數是對應的,允許槽的函式比訊號的函式少,但是排列順序不能變。

當訊號的引數被過載或者訊號引數與槽函式的引數不一致時,需要指定本次connect時訊號使用的引數或者將訊號使用的引數強轉,這就用到了訊號過載。

比如常用的QComboBox類中的&QComboBox::activated訊號,檢視activated的定義為void activated(const QString &);,也就是說人家本來的引數是QString型別的。而在QT的幫助中,我們可以看到[signal] void QComboBox::activated(int index),說明它是要當int型別的引數使用的。我們在使用過程中,也是要知道哪一個index被選中(與currentIndex稍有不同,不改變選項也會觸發訊號),也就是用int型別的引數。用QT5的方式寫的話,就需要用到訊號引數的過載了,要不然connect就會提示錯誤: no matching member function for call to 'connect'。

簡單來講,就是將原來直接寫的訊號&QComboBox::activated,變成這樣的形式就可以了:

QOverload<int>::of(&QComboBox::activated)


QOverload就是過載的意思,尖括號裡邊的<int>,就是將訊號的引數過載為int型別,在我們自己寫的訊號需要過載時,用這種方式也是特別方便,官方給力例子挺好的,用的lambda表示式,我們也可以用常用的專門寫一個槽函式的方式,這樣在用比較大型的槽的時候比較方便。

官方給的例子是:

connect(comboBox, QOverload<int>::of(&QComboBox::activated),
[=](int index){ /* ... */ });
//int index,是lambda表示式中傳入的引數,是一個匿名函式,僅能透過這個訊號槽的形式才可以執行{ /* ... */ }中的內容;
//當需要操作內容比較少且執行的內容不需要被其他函式呼叫時,用lambda表示式是一個不錯的選擇;
//[=]是lambda表示式可以用外部的變數,lambda表示式外部的變數,例如全域性變數、類變數等,透過值傳遞的方式供lambda表示式使用;

我們自己的槽函式可以這樣寫:

1 connect(comboBox ,QOverload<int>::of(&QComboBox::activated),this,&MainWindow::myslot);
2 //comboBox 為訊號傳送的物件,如果不是new出來而是直接在UI裡面畫的,也可以用ui->comboBox ;
3 //&QComboBox::activated是需要過載的訊號,<int>是過載為的型別,錯誤的過載會導致訊號資料錯誤,需要注意,QOverload<int>::of(&QComboBox::activated)是過載之後訊號的完整形式;
4 //&MainWindow::myslot,MainWindow為當前類的類名,myslot為當前類的槽函式,槽函式帶有一個int型別的引數,和訊號引數保持一致。

相關文章