?需要云服務(wù)器等云產(chǎn)品來學(xué)習(xí)Linux的同學(xué)可以移步/-->騰訊云<--/-->阿里云<--/-->華為云<--/官網(wǎng),輕量型云服務(wù)器低至112元/年,新用戶首次下單享超低折扣。
?目錄
一、Qt中的信號和槽
1、信號
2、槽
3、Q_OBJECT
二、Qt中的connect函數(shù)
三、自定義信號、自定義槽
1、自定義槽函數(shù)
1.1使用代碼創(chuàng)建控件的方式
1.2使用ui創(chuàng)建控件的方式
2、自定義信號
四、帶參數(shù)的信號和槽
五、信號和槽斷開連接
六、使用lambda表達(dá)式定義槽函數(shù)
一、Qt中的信號和槽
1、信號
信號源:由哪個控件產(chǎn)生的信號
信號的類型:用戶對GUI界面的不同操作,就可能觸發(fā)不同的信號(點擊、移動光標(biāo)、勾選、下拉等)
2、槽
信號的處理方式:槽 =>處理信號的回調(diào)函數(shù)
Qt使用connect這樣的函數(shù),把一個信號和一個槽關(guān)聯(lián)起來。信號觸發(fā),自動回調(diào)信號處理函數(shù)。
3、Q_OBJECT
如果一個類要使用信號和槽,必須在類中添加Q_OBJECT這個宏
二、Qt中的connect函數(shù)
connect是QObject(Qt中其他類的“祖先類”)提供的靜態(tài)成員函數(shù)。
bool QObject::connect(const QObject *sender,
const QMetaMethod &signal,
const QObject *receiver,
const QMetaMethod &method, Qt::ConnectionType type=Qt::AutoConnection);
- const QObject *sender: 哪個控件?
- const QMetaMethod &signal: 哪種信號?(必須是信號源自帶或繼承自父類的信號)
- const QObject *receiver: 哪個對象負(fù)責(zé)處理?
- const QMetaMethod &method: 用于處理信號的槽函數(shù)。(要處理信號的對象提供的成員函數(shù))
- Qt::ConnectionType type: 連接類型,它可以指定連接的類型,如自動連接、直接連接等。通常不需要手動設(shè)定。
- 第一個和第二個參數(shù),第三個和第四個參數(shù)類型要對上才行。
[signal] void QAbstractButton::clicked(boolchecked = false)
This signal is emitted when the button is activated (i.e., pressed down then released while the mouse cursor is inside the button), when the shortcut key is typed, or when click() or animateClick() is called. Notably, this signal is not emitted if you call setDown(), setChecked() or toggle().
If the button is checkable, checked is true if the button is checked, or false if the button is unchecked.
See also pressed(), released(), and toggled().
三、自定義信號、自定義槽
1、自定義槽函數(shù)
槽函數(shù)一般用于用戶觸發(fā)某個操作后,需要執(zhí)行的業(yè)務(wù)邏輯。所以需要自定義槽函數(shù)。
1.1使用代碼創(chuàng)建控件的方式
1.2使用ui創(chuàng)建控件的方式
自動生成的槽函數(shù)的名字是on_pushButton_clicked,其中on是固定的,pushButton是ui中的objectName,clicked寫明了是哪種信號。所以ui自動生成的槽函數(shù)不需要connect函數(shù)就能在觸發(fā)信號時被回調(diào)。(ui_widget.h中調(diào)用了QMetaObject::connectSlotsByName,它會觸發(fā)自動連接信號槽的規(guī)則)
2、自定義信號
自定義信號很少用到。因為在GUI中,用戶的操作行為是可以窮舉的,Qt內(nèi)置的信號已經(jīng)覆蓋到了大部分可能的用戶操作。
如果真的需要自定義信號:
1、信號是一種特殊的函數(shù),程序員只需寫出函數(shù)聲明,并告訴Qt,這是一個信號即可。這個函數(shù)的定義,是Qt在編譯過程中,自動生成的。(無法干預(yù))
2、信號函數(shù)的返回值必須是void,有沒有參數(shù)都可以,也支持函數(shù)重載。
3、信號可以使用emit關(guān)鍵字進行發(fā)射。(Qt5 emit不寫也行)
四、帶參數(shù)的信號和槽
信號和槽也可以帶參數(shù)。發(fā)射信號時,就可以給信號函數(shù)傳遞實參,這個參數(shù)就會被傳遞到對應(yīng)的槽函數(shù)中。
信號和槽函數(shù)的參數(shù)類型必須一致,個數(shù)可以不一致,但是信號的參數(shù)個數(shù)必須大于槽函數(shù)的參數(shù)個數(shù)。
一個信號通過connect關(guān)聯(lián)多個槽函數(shù),一個槽函數(shù)也能被多個信號關(guān)聯(lián)。
五、信號和槽斷開連接
使用disconnect斷開信號槽的連接(主動斷開往往是把信號重新綁定到另一個槽函數(shù)上)
如果這里的代碼沒有disconnect,會使一個信號綁定兩個槽函數(shù),觸發(fā)點擊按鈕,同時執(zhí)行兩個槽函數(shù)。
六、使用lambda表達(dá)式定義槽函數(shù)
注意被捕獲變量的生命周期。
盡量傳值捕獲,傳引用捕獲可能會捕獲到已經(jīng)被釋放的變量,造成段錯誤。例如:
文章來源:http://www.zghlxwxcb.cn/news/detail-811641.html
上圖傳值捕獲沒問題,傳引用捕獲會崩潰。原因是button是局部變量(它指向的空間位于堆區(qū),但它自己是一個局部變量的指針),構(gòu)造函數(shù)結(jié)束后button變量即被銷毀,造成段錯誤。文章來源地址http://www.zghlxwxcb.cn/news/detail-811641.html
到了這里,關(guān)于【Qt】信號和槽的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!