Qt之 訊號與槽 connect新語法(自動關聯)

2021-09-24 17:36:04 字數 2307 閱讀 1367

connect(sender, signal(valuechanged(qstring, qstring)),

receiver, slot(updatevalue(qstring)));

qt 實際上利用signalslot這兩個巨集,把其後的函式名轉換成乙個字串。隨後,moc 將會掃瞄全部檔案,將所有的 signal 和 slot 提取出來做成乙個對映表。qobject::connect()函式則會從這個對映表裡面找到該字串,從 signal 的名字就可以找到 slot 的名字,因此也就知道了在 signal emit 的時候,該去呼叫哪乙個 slot 函式。

從上面的解釋可以看出,qt 5 之前版本提供的這種語法其實有一些問題:

在 qt5 提供了一套新的語法。之前的語法依然可以使用,但是現在,我們有了更好的選擇:

class mybutton : public qwidget

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

這個看起來和之前的版本很類似,因此很容易遷移到新的語法。下面我們看看新語法有什麼好處:

如果把 signal 或者 slot 名字編寫錯誤,或者 slot 的引數同 signal 不一致,你會在編譯期就獲得乙個錯誤。這肯定會在重構、或者修改 signal 或 slot 的名字時節省很多時間。但是存在一些坑需要注意,假設我將訊號過載的話,會報錯下面的錯誤:

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 吧,比較保險,雖然比較麻煩點。

另乙個好處:引數的自動型別轉換

我們不僅可以更好地使用 typedef 或 namespace,而且可以利用隱式型別轉換。在下面的例子中,我們的 signal 有乙個qstring引數,而 slot 需要的是qvariant。在新語法中,qstring將被自動轉換成qvariant

更進一步,我們可以將 signal 連線到任意函式:

static void somefunction() 

// ... somewhere else

qobject::connect(button, &qpushbutton::clicked, somefunction);

訊號與槽還有乙個自動連線操作:

例如:on_pushbutton_clicked()由on、部件的objextname和訊號3部分組成,中間由下劃線隔開,這樣組織的名稱的槽就可以直接和訊號關聯,而不用使用connect函式,不過這種方式還需要進行其他設定,而前面之所以可以直接使用,是因為程式中預設設定過了,在在程式開頭ui->setupui(this)就是呼叫connectslotsbynmae()函式支援訊號與槽的自動關聯的,

所以我們要在setupui之前設定好物件名

qpushbutton *button = new qpushbutton(this);

button->setobjectname("mybutton");//指定按鈕的物件名

ui->setupui(this);

然後你

//使用自動關聯,此處就是指定按鈕的物件名,一定要相同

void qmainwindow::on_mybutton_clicked()

方法還有很多種,常用的就這樣啦

Qt訊號與槽connect 函式

qmetaobject connection qobject connect const qobject sender,傳送方物件 const char signal,傳送物件中的事件訊號 const qobject receiver,接收方物件 const char method,接收物件中的要執...

Qt訊號與槽的connect

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

QT訊號槽connect函式

使用qt開發時,通常使用connect函式只傳遞四個引數 connect sender,signal signal receiver,slot slot 所以我們有可能認為該函式就只有四個引數,但實際上是有第五個引數的,只是通常該函式已經給第五個引數賦值了而已,我們所使用的是預設值 sender和r...