20221210 QT----信号和槽的使用

信号和槽的使用

文章内容为B站 大轮明王讲Qt 的学习笔记

什么是信号(signal)

以QPushButton为例:
(1)按下按钮时,会触发一个mousePressEvent事件,此时会发出一个pressed信号;
(2)松开按钮时,会触发一个mouseReleaseEvent事件,此时会发出released和clicked信号。
事件的种类有很多,不同的事件都对应着不同的信号,当事件发生时,对应的信号就会发出,我个人把他理解成一个事件发生的标志。

什么时槽(slot)

槽,即为槽函数,它需要与信号进行绑定,也就是信号发出后,系统会去调用的一个函数。

信号和槽的绑定(connect)

通过上面的介绍我们知道,信号和槽是一一对应的,当信号产生后,会有一个槽函数去执行以响应该信号,因此这中间就需要有一个东西将二者连接起来,我们通常使用connect实现。

信号(signal)<------>connect<------>槽(slot)

connect的作用就是将二者绑定在一起,具体用法在下面介绍。

标准信号和槽的使用

以QPushButton为例,首先在UI界面中拖拽两个pushbutton,如图所示。
在这里插入图片描述
双击按钮,即可修改按钮的文本显示内容,在右侧属性菜单栏中,可以修改对应按钮的ObjectName,这是我们在编程中需要用到的,这里我设置的是btn_wdmax和btn_wdmin。
接下来,我们可以在帮助文档中,查看QPushbutton都有具有哪些标准信号和槽,如下图所示。
在这里插入图片描述
我们点击QAbstractButton,进入QPushButton的父类中找到其继承的信号。
在这里插入图片描述
在QPushButton中可以找到其对应的Slots如下。
在这里插入图片描述
接下来,我们在程序中简单使用信号和槽,实现相关功能,还是使用上篇文章中建立的工程,在mainwindow.cpp中进行编程。

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)  //这里new了一个类,那么就需要在析构函数中删除这个类
{
    ui->setupUi(this);      //这里的this代表MainWindow,作为实参传递给setupUi函数

    //connect(发送信号的对象,发送的信号,接收信号的对象,接收信号后执行的函数方法)
    connect(ui->btn_wdmax,SIGNAL(clicked()),this,SLOT(showMaximized()));
    connect(ui->btn_wdmin,SIGNAL(clicked()),this,SLOT(showMinimized()));

}

执行上述程序,即可实现我们按钮所对应的功能,这就是标准信号和槽的简单应用。

自定义信号和槽的使用

自定义信号和槽的条件:

1.自定义的类,要继承自QObject
2.自定义的类,其中要声明一个宏Q_OBJECT

简单案例使用:
实现:长官(Commander)发送一个go信号,然后Soldier执行fight槽函数。

(1)创建Commander和Soldier类

在这里插入图片描述
右击项目名称->添加新文件弹出图示界面,选择C++ Class。
在这里插入图片描述
在这里输入类名Commander,并且Base Class中选择QObject,下一步即可,即可成功创建Commander类,同样的方法去创建Soldier类。

(2)创建自定义信号

在这里插入图片描述

在commander.h中添加自定义信号,这里commander只发送信号,因此我们只在signals处创建信号,注意:信号无返回值,但其可以传递参数。

(3)创建自定义槽函数

在这里插入图片描述

在soldier.h中添加槽函数,在public slots处添加槽函数,注意:槽函数的参数和返回值要和信号一一对应。

(4)自定义信号和槽的使用
//1.创建信号和槽的对象
Commander commander;
Soldier soldier;

//2.建立信号和槽的连接
connect(&commander,SIGNAL(go(QString)),&soldier,SLOT(fight(QString)));

//3.发送信号
commander.go("fight");

在主程序中输入如下代码,点击运行即可实现我们的功能,程序会输出字符串 fight

信号和槽的连接方式

(1)SIGNAL/SLOT
(2)函数地址
(3)UI设计师界面-转到槽
(4)UI设计师界面-信号槽编辑器
(5)lambda表达式

SIGNAL/SLOT

上面使用的就是这种方式

函数地址(推荐)
//2. 函数指针 编译时会检查函数名(推荐)
//connect(发送者,&信号类::信号,接受者,&槽函数类::槽函数)
connect(ui->btn2,&QPushButton::clicked,this,&QMainWindow::showNormal);
设计者界面-转到槽 (不推荐)
右键按钮,选择对应信号,生成对应的槽函数,此时无需connect在生成函数中写槽函数的逻辑
设计者界面-信号槽编辑器(不推荐)

不写了

lambda表达式

C++中lambda表达式复习

[capture](parameters)option->return-type{body}
capture:捕获列表,可选
捕获列表总是出现在lambda表达式的开始,实际上,[ ]是lambda引出符,编辑器根据该引出符判断接下来的代码是否是lambda表达式。
捕获列表能够捕捉上下文中的变量,例:
[ ]  // 不捕获任何变量
[ & ] //按引用捕获外部作用域中所有变量,在lambda表达式内使用
[ = ]	//按值捕获外部作用域中所有变量,在lambda表达式中使用,只读属性
[ = , &foo]	//捕获外部作用域中所有变量,其中foo变量按引用捕获,其他按值捕获
[ bar ]	//按值捕获bar变量,同事不捕获其他变量
[ this ]	//捕获当前类中的 this 指针,可以在lambda中使用当前类的成员变量和函数,如果已经使用了& 或者 = ,就默认添加此选项
parameters:参数列表,可选
option:函数选项,可选
return-type:返回值类型,可选。没有返回值时,可以省略 ->
body:函数体
lambda连接信号和槽
//5. lambda表达式
connect(ui->btn5,&QPushButton::clicked,this,[&](){
    this->setWindowTitle("[信号和槽连接的方式 之 lambda]");
});
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值