網(wǎng)站首頁 編程語言 正文
一.含義與使用
(一).含義
信號與槽是qt中一種常用的通信手段。發(fā)送方發(fā)送信號,接收方通過槽進(jìn)行接收并完成具體任務(wù)。
簡單來講,就是通過發(fā)送一個函數(shù)(信號),接收方通過另一個函數(shù)(槽)完成任務(wù)。
(二).connect使用
用法上,通過connect函數(shù)進(jìn)行連接。
connect(發(fā)送方地址,信號函數(shù),接收方地址,槽函數(shù));
比如我們舉如下例子:
通過點(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信號函數(shù)與QWidget類的close槽函數(shù)連接
connect(but, &QPushButton::clicked, this, &QWidget::close);
}
當(dāng)我們進(jìn)行點(diǎn)擊窗口操作時,執(zhí)行clicked函數(shù)進(jìn)而觸發(fā)close關(guān)閉窗口。
如果使用的信號函數(shù)或槽函數(shù)有重載情況,那么這樣直接通過地址傳函數(shù)就 不可能了,因?yàn)闊o法區(qū)別參數(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時有幾點(diǎn)需要注意:
1.信號函數(shù)與槽函數(shù)的參數(shù)類型必須匹配,且信號函數(shù)參數(shù)個數(shù)可以比槽函數(shù)多,但絕對不能少。
2.一個信號函數(shù)可以連接多個槽函數(shù)
3.多個信號函數(shù)可以連接同一個槽函數(shù)
QT4之下的版本不支持這種connect形式,只能通過如下形式使用:
connect( 發(fā)送方地址,SIGNAL( 信號函數(shù)(參數(shù)) ),接收方地址,SLOT( 槽函數(shù)(參數(shù)) ) );
SIGNAL和SLOT是宏,編譯時會將信號函數(shù)和槽函數(shù)用字符串替換,并且不會判斷參數(shù)是否相互匹配,因此只要不是Qt版本問題,并不推薦使用這種方式。
使用disconnect可以斷開信號與槽的連接,參數(shù)與connect一致。?
(三).信號函數(shù)
如果我們自定義信號函數(shù),有幾點(diǎn)需要注意:
1.信號函數(shù)需要使用signals關(guān)鍵字聲明
class A : public QObject
{
Q_OBJECT
public:
explicit A(QObject *parent = nullptr);
signals://以下均為信號函數(shù)
void funcA();
void funcA(QString str);
};
2.信號函數(shù)不能定義,只用聲明即可。
3.返回值為void
4.可帶參數(shù),可重載
5.可以使用emit關(guān)鍵字主動釋放信號觸發(fā)槽函數(shù)。
void test{
emit A()->funcA();//使用無參版本
}
(四).槽函數(shù)
自定義槽函數(shù)也有幾點(diǎn)需要注意:
1.可聲明為類的任意成員函數(shù)(一般為public),較早版本必須在public slots關(guān)鍵字下聲明。
2.返回類型為void
3.可帶參數(shù),可重載
4.可以使用lambda表達(dá)式替換
二.示例
我們寫一個程序,按鈕按下時打開一個窗口同時按鈕顯示“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");
}
});
//定義一個按鈕end,按下直接關(guān)閉myWidget窗口退出程序
QPushButton* end = new QPushButton("end", this);
but->move(100, 200);
connect(end, &QPushButton::clicked, this, &QWidget::close);
}
總結(jié)
原文鏈接:https://blog.csdn.net/weixin_61857742/article/details/128351351
相關(guān)推薦
- 2021-12-11 Linux環(huán)境下查看日志文件命令詳解_Linux
- 2022-04-23 R語言繪制line?plot線圖示例詳解_R語言
- 2022-10-09 ASP.NET?Core?5.0中的Host.CreateDefaultBuilder執(zhí)行過程解析_
- 2023-01-28 python基礎(chǔ)之reverse和reversed函數(shù)的介紹及使用_python
- 2022-04-28 使用Matlab制作簡易版八分音符醬游戲_C 語言
- 2022-10-06 Redis位圖bitmap操作_Redis
- 2022-11-09 Oracle如何在SQL語句中對時間操作、運(yùn)算_oracle
- 2022-12-01 .NET?Core部署為Windows服務(wù)的詳細(xì)步驟_實(shí)用技巧
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支