QT中的connect用法總結

2021-09-02 02:25:10 字數 1610 閱讀 5196

首先來看看老版本的 connect 寫法,比較複雜些,需要將訊號和槽進行明確的指定,包括形參。 

看乙個示例:

為方便演示,先自定義乙個 button,然後定義兩個過載的訊號

class mybutton : public qwidget

;那麼在用這個 button 的時候連線這兩個訊號,按照舊版本的寫法,應該是這樣:

connect(m_pbtn,signal(sigclicked()),this,slot(onclicked()));

connect(m_pbtn,signal(sigclicked(bool)),this,slot(onclicked(bool)));

這種寫法比較麻煩,常常在用的時候缺少括號,不過該寫法很明確,一眼就能看出來是將哪個訊號連線到哪個槽。

接著上面的示例,在 qt5.0以後推出一種新的寫法,如下:

connect(m_pbtn,&mybutton::sigclicked,this,&widget::onclicked);

這種寫法看起來很簡潔,但是存在一些坑需要注意,這句寫法如果用在上面的示例中,會報錯下面的錯誤:

error: no matching member function for call to 'connect' connect(m_pbtn,&mybutton::sigclicked,this,&widget::onclicked);

這是因為我們自定義的 button 中存在兩個過載訊號,然後用這種 connect 的方式會無法識別到底想要連線哪個訊號。所以,如果訊號是過載的話,需要用下面的寫法來替換:

connect(m_pbtn, static_cast(&mybutton::sigclicked), this, &widget::onclicked);

問題又來了,如果我的onclicked槽也是過載的話,還是會報同樣的錯誤。因為編譯器不知道你想要真正連線哪個槽。所以這裡建議,如果訊號過載,可以用上面的方法來寫,如果槽過載…還是用第一種方法來 connect 吧,比較保險,雖然比較麻煩點。

最後來看一種最新的寫法,忘記是在 qt 的哪個版本推出的了,主要針對過載訊號的連線做了調整,會更簡單些: 

同樣是上面的示例:

connect(m_pbtn, qoverload::of(&mybutton::sigclicked),this,&widget::onclicked);

很顯然這種寫法相對於第二種會比較簡單些,但依然不能連線到過載的槽函式,如果連線過載槽函式,還是會報之前的錯誤。

個人比較喜歡用lambda函式的方式,如果槽函式中的內容比較簡單的話,沒必要再去單獨定義乙個槽來連線, 直接用lambda 函式會更簡單。 

來看一下示例:

connect(m_pbtn, qoverload::of(&mybutton::sigclicked),

[=](bool check){

/* do something.. */

connect(m_pbtn, static_cast(&mybutton::sigclicked), this, [=](bool check){

//do something

以上部分是**:

最後一部分的lambda函式寫法,是涉及到了c++11的特性,具體關於lambda函式的形式、寫法,可以看:

QT的connect函式總結

第一種寫法 connect m pbtn,signal sigclicked this slot onclicked 第二種寫法 connect m pbtn,mybutton sigclicked,this widget onclicked 當訊號過載時不能區分訊號導致bug 第三種寫法 conn...

qt中的 connect 函式

1 connect 函式實現的是訊號與槽的關聯。注意 只有qo bject類及其派生的類才能使用訊號和槽的機制 2 函式原型 static qmetaobject connection connect const qobject sender,const char signal,const qobj...

Qt訊號與槽的connect

函式原型 qmetaobject connection qobject connect const qobject sender,const char signal,const qobject reciver,const char method,qt connectiontype type qt a...