信号和槽的使用
文章内容为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在生成函数中写槽函数的逻辑
设计者界面-信号槽编辑器(不推荐)
不写了文章来源:https://www.toymoban.com/news/detail-552600.html
lambda表达式
C++中lambda表达式复习文章来源地址https://www.toymoban.com/news/detail-552600.html
[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]");
});
到了这里,关于20221210 QT----信号和槽的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!