Qt信號(hào)與槽知識(shí)點(diǎn)總結(jié)歸納
一.含義與使用
(一).含義
信號(hào)與槽是qt中一種常用的通信手段。發(fā)送方發(fā)送信號(hào),接收方通過(guò)槽進(jìn)行接收并完成具體任務(wù)。
簡(jiǎn)單來(lái)講,就是通過(guò)發(fā)送一個(gè)函數(shù)(信號(hào)),接收方通過(guò)另一個(gè)函數(shù)(槽)完成任務(wù)。
(二).connect使用
用法上,通過(guò)connect函數(shù)進(jìn)行連接。
connect(發(fā)送方地址,信號(hào)函數(shù),接收方地址,槽函數(shù));
比如我們舉如下例子:
通過(guò)點(diǎn)擊按鈕實(shí)現(xiàn)關(guān)閉窗口。
myWidget::myWidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::myWidget)
{
ui->setupUi(this);
but = new QPushButton("close", this);
but->move(200, 200);
//將按鈕clicked信號(hào)函數(shù)與QWidget類(lèi)的close槽函數(shù)連接
connect(but, &QPushButton::clicked, this, &QWidget::close);
}當(dāng)我們進(jìn)行點(diǎn)擊窗口操作時(shí),執(zhí)行clicked函數(shù)進(jìn)而觸發(fā)close關(guān)閉窗口。
如果使用的信號(hào)函數(shù)或槽函數(shù)有重載情況,那么這樣直接通過(guò)地址傳函數(shù)就 不可能了,因?yàn)闊o(wú)法區(qū)別參數(shù)。
此時(shí)需要使用函數(shù)指針完成指定重載版本的調(diào)用。
舉例如下:
A* pa = new A; B* pb = new B; void(A::*APtr)(QString) = &A::funcA; void(B::*BPtr)(QString) = &B::funcB; //指定調(diào)用參數(shù)為QString的重載版本 connect(pa, APtr, pb, BPtr);
在使用connect時(shí)有幾點(diǎn)需要注意:
1.信號(hào)函數(shù)與槽函數(shù)的參數(shù)類(lèi)型必須匹配,且信號(hào)函數(shù)參數(shù)個(gè)數(shù)可以比槽函數(shù)多,但絕對(duì)不能少。
2.一個(gè)信號(hào)函數(shù)可以連接多個(gè)槽函數(shù)
3.多個(gè)信號(hào)函數(shù)可以連接同一個(gè)槽函數(shù)
QT4之下的版本不支持這種connect形式,只能通過(guò)如下形式使用:
connect( 發(fā)送方地址,SIGNAL( 信號(hào)函數(shù)(參數(shù)) ),接收方地址,SLOT( 槽函數(shù)(參數(shù)) ) );
SIGNAL和SLOT是宏,編譯時(shí)會(huì)將信號(hào)函數(shù)和槽函數(shù)用字符串替換,并且不會(huì)判斷參數(shù)是否相互匹配,因此只要不是Qt版本問(wèn)題,并不推薦使用這種方式。
使用disconnect可以斷開(kāi)信號(hào)與槽的連接,參數(shù)與connect一致。
(三).信號(hào)函數(shù)
如果我們自定義信號(hào)函數(shù),有幾點(diǎn)需要注意:
1.信號(hào)函數(shù)需要使用signals關(guān)鍵字聲明
class A : public QObject
{
Q_OBJECT
public:
explicit A(QObject *parent = nullptr);
signals://以下均為信號(hào)函數(shù)
void funcA();
void funcA(QString str);
};2.信號(hào)函數(shù)不能定義,只用聲明即可。
3.返回值為void
4.可帶參數(shù),可重載
5.可以使用emit關(guān)鍵字主動(dòng)釋放信號(hào)觸發(fā)槽函數(shù)。
void test{
emit A()->funcA();//使用無(wú)參版本
}(四).槽函數(shù)
自定義槽函數(shù)也有幾點(diǎn)需要注意:
1.可聲明為類(lèi)的任意成員函數(shù)(一般為public),較早版本必須在public slots關(guān)鍵字下聲明。
2.返回類(lèi)型為void
3.可帶參數(shù),可重載
4.可以使用lambda表達(dá)式替換
二.示例
我們寫(xiě)一個(gè)程序,按鈕按下時(shí)打開(kāi)一個(gè)窗口同時(shí)按鈕顯示“close”,再次按下關(guān)閉窗口按鈕變成“open”。
myWidget::myWidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::myWidget)
{
ui->setupUi(this);
//設(shè)置窗口
setFixedSize(500, 500);
//設(shè)置按鈕
but = new QPushButton("open", this);
but->move(200, 200);
but->setCheckable(true);//如果使用toggled必須先使用該函數(shù),clicked亦可。
mw = new QWidget;//窗口
mw->setWindowTitle("Gap");//窗口名
//使用lambda表達(dá)式代替槽函數(shù)
connect(but, &QPushButton::toggled, this, [&]()mutable{
if(but->text() == "open"){
mw->show();
but->setText("close");
}
else{
mw->close();
but->setText("open");
}
});
//定義一個(gè)按鈕end,按下直接關(guān)閉myWidget窗口退出程序
QPushButton* end = new QPushButton("end", this);
but->move(100, 200);
connect(end, &QPushButton::clicked, this, &QWidget::close);
}總結(jié)
到此這篇關(guān)于Qt信號(hào)與槽知識(shí)點(diǎn)總結(jié)歸納的文章就介紹到這了,更多相關(guān)Qt信號(hào)與槽內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ 內(nèi)存分配處理函數(shù)set_new_handler的使用
這篇文章主要介紹了C++ 內(nèi)存分配處理函數(shù)set_new_handler的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
Cocos2dx實(shí)現(xiàn)數(shù)字跳動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了Cocos2dx實(shí)現(xiàn)數(shù)字跳動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-09-09
C語(yǔ)言實(shí)現(xiàn)學(xué)生個(gè)人消費(fèi)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言學(xué)生個(gè)人消費(fèi)管理系統(tǒng)開(kāi)發(fā),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
基于Qt開(kāi)發(fā)一個(gè)簡(jiǎn)單的OFD閱讀器
這篇文章主要為大家詳細(xì)介紹了如何使用Qt框架開(kāi)發(fā)一個(gè)功能強(qiáng)大且性能優(yōu)異的OFD閱讀器,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考一下2025-01-01
C語(yǔ)言實(shí)現(xiàn)哈夫曼樹(shù)的方法
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)哈夫曼樹(shù)的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-05-05
c++ 虛函數(shù),虛表相關(guān)總結(jié)
這篇文章主要介紹了c++ 虛函數(shù),虛表的的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下2021-03-03
C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲的示例代碼
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言如何實(shí)現(xiàn)經(jīng)典貪吃蛇游戲,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C語(yǔ)言有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下2023-01-01
C語(yǔ)言實(shí)現(xiàn)BMP圖像的讀寫(xiě)功能
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)BMP圖像的讀寫(xiě)功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04

