QT信号和槽

一.四种信号与槽的实现方式

cpp 复制代码
//在构造函数中进行信号与槽的绑定
//第一种方式:connect直接连接  Q0bject::connect(sender,SIGNAL(signal()),receiver, SLoT(slot()));
Qobject::connect(ui->btncon, SIGNAL(clicked()),this,sLoT(on_btncon_clickedMyself()));
//第二种方式:lambda表达式:   Q0bject::connect(sender,&sender::signal,[=](){/* lambda body */});
Q0bject::connect(ui->btnLambda, &QPushButton::clicked,[=](){std::cout<<"btnLambdaclicked"<< std::endl;子):
//第三种方式:函数指针   Q0bject::connect(sender,&Sender::signal,receiver,&Receiver::slot);
Qobject::connect(ui->btnFortch,&0PushButton::clicked,this,&widget::on fortch _clicked);
//第四种方式,使用QT Designer选择控件,跳转槽,选择信号,QT会自动生成槽函数,
//并将此信号与槽函数连接,可以自己实现槽函数内容。

二.信号与槽的自定义

Qt信号和槽机制提供了允许我们自己设计自己的信号和槽。

connect函数是建立信号发送者、信号、信号接收者、槽四者关系的函数:

复制代码
    connect(sender, signal, receiver, slot);

emit函数用来发送信号

复制代码
     emit  signal

自定义信号使用条件

复制代码
    声明在类的signals域下
    没有返回值,void类型的函数
    只有函数声明,没有定义
    可以有参数,可以重载

自定义槽函数使用条件

复制代码
    qt4 slots域下面,qt5之后可以声明public下,同时还可以是静态的成员函数,全局函数,lambda表达式
    没有返回值,void类型的函数
    不仅有声明,还得要有实现
    可以有参数,可以重载

信号和槽都需要定义在头文件中,信号无需实现,槽函数需要实现,信号的参数一般需要与槽函数的参数对应,但也可以多于槽函数的参数。

信号和槽在传入connect函数中时,有两种传入方式,一是使用SIGNAL(),SLOT()传入 (QT4的传入方式),二是使用函数指针进行传入

信号与槽可以发生重载,那么在使用,如何区分使用哪一对信号与槽呢。

使用函数指针时,无法直接区分,需要使用在connect外利用函数指针接收地址。

使用SIGNAL与SLOT时,可以直接区分。

void(Widget::*p)(int) = &Widget::mysignal;

void(Widget::*s)(int) = &Widget::myslot;

connect(this,p,this,s);

拓展

1.一个信号可以和多个槽相连

如果是这种情况,这些槽会一个接一个的被调用,但是槽函数调用顺序是不确定的。

  1. 多个信号可以连接到一个槽

只要任意一个信号发出,这个槽就会被调用。如:一个窗口多个按钮都可以关闭这个窗口。

3.一个信号可以连接到另外的一个信号

当第一个信号发出时,第二个信号被发出。除此之外,这种信号-信号的形式和信号-槽的形式没有什么区别。

4.信号和槽可以断开连接

可以使用disconnect函数,当初建立连接时connect参数怎么填的,disconnect里边4个参数也就怎么填。这种情况并不经常出现,因为当一个对象delete之后,Qt自动取消所有连接到这个对象上面的槽。

5.信号和槽函数参数类型和个数必须同时满足两个条件

1)信号函数的参数个数必须大于等于槽函数的参数个数

2)信号函数的参数类型和槽函数的参数类型必须一一对应

相关推荐
吴声子夜歌几秒前
Guava——反射
java·开发语言·guava
lingran__5 分钟前
Git 完全指南(三):远程仓库与标签管理
开发语言·git·gitee·ssh·团队协作·远程仓库·分布式版本控制
for_ever_love__7 分钟前
python爬虫: 数据解析
开发语言·爬虫·python·xpath
学习星球16 分钟前
AI 一句话生成 3D 游戏世界:腾讯 HY-World 2.0 开源深度解析与本地实战
开发语言·人工智能·游戏·3d·ai·课程设计·ai编程
名字还没想好☜18 分钟前
Go 用 -race 抓数据竞争:一个偶发崩溃的排查、原理与修复
开发语言·后端·golang·go
励志不掉头发的内向程序员19 分钟前
LibreCAD 2D架构】从鼠标点击到屏幕像素:LibreCAD绘图架构全链路解析之鼠标事件与RS_ActionDrawLine
c++·qt·学习·架构·计算机外设
小灰灰搞电子29 分钟前
Rust std::vec::Vec<T>动态数组:所有相关 API 全面介绍
开发语言·rust
学习星球32 分钟前
CodeWhale 深度剖析:从 DeepSeek-TUI 到 40.9K Star 的 Rust 终端编程 Agent
开发语言·后端·rust
曹牧1 小时前
C#:线程间操作无效,不是从创建控件线程访问
开发语言·c#
承渊政道3 小时前
【Python编程—从入门到实践】(Python条件判断完全入门:从布尔表达式到列表中的if实战)
开发语言·python·pycharm·条件判断·布尔表达式