信号与槽机制是一个非常强大的事件通信机制,是 Qt 最核心的机制之一,初学者掌握它之后,几乎可以做任何交互操作。
信号(Signal) 是一种“事件”或“通知”,比如按钮被点击、文本改变、窗口关闭等。
槽(Slot) 是一个“处理函数”,用于响应信号。
当信号发生时,自动调用连接的槽函数,实现逻辑响应。
简单的信号与槽构建示例
+-构建
如果你的栏布局与主包一样,如下
在黑框右键,点击“重置为默认布局”,就能出现如下“+”“-”号
点击“+”号,双击(<发送者>等)输入内容,示例为点击打开按钮,就关闭窗口
点击要删除的命令,再点击“-”号就能删除
Edit Signals块
我觉得使用相对麻烦,就不详细介绍了,大家可以不学这种。
点击符号后,将鼠标放在对象上会变红,点击要选择的信号发送者
点击后会由对象伸出一条红色的单项箭头,点击要选择的接收者,选择发送者发出的信号和接收者的响应操作
点击左边的Edit Widgets退出编辑操作
代码方式实现
ui+代码
右键按钮,点击“转到槽”
选择信号,点击“OK”
就跳转到了widget.cpp文件,会自动生成相关槽函数,.h文件也会增添相应声明
我们可以在槽函数里输出一句话(记得在.h文件增添头文件<iostream>),保存
点击“打开”按钮后出现如下输出
QObject::connect函数
在构造函数中进行信号与槽的绑定
打开widget.cpp,输入如下连接代码
QObject::connect(发送者,SIGNAL(检测信号),接收者,SLOT(超函数));
this代表这个窗口 ,SLOT()超函数需在头文件声明
函数实现
声明后右键函数,点击“Refactor”,点击“在widget.cpp中添加定义”
在跳转后的widget.cpp中的生成函数中输入如下代码
点击“关闭”按钮后,输出如下
lambda表达式
也可以直接写lambda表达式,就不用声明函数了(是匿名函数),接收者this要不需要写,默认为窗体本身
点击“保存”键后输出如下
使用函数指针
与使用connect函数构建相似,不再赘述,给出widget.cpp文件中的代码
QObject::connect(ui->Bclose,&QPushButton::clicked,this,&widget::on_fortch_clicked);
自定义信号与槽
先在.h头文件声明信号,声明槽(红杠处为添加部分)
在.cpp文件中实现槽函数
QDebug是Qt中用于输出调试信息的类,提供了一种方便的方式来输出文本到标准输出,返回一个QDebug对象,使用流操作符<<输出各种数据类型,与cout使用类似
需在.h中引入<QDebug>头文件
在.cpp的构造函数中连接信号与槽(connect前面可以声明QObject也可以不写,因为Widget是QObject的派生类,可使用基函数的成员函数)
再使用emit关键字触发信号,输出如下
带参数
.cpp代码如下
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
connect(this,SIGNAL(mysignal(int)),this,SLOT(myslot(int)));
emit mysignal(100);
}
Widget::~Widget()
{
delete ui;
}
void Widget::myslot(int value)
{
qDebug()<<"myslot";
qDebug()<<value;
}
运行结果如下
虽然我们约定信号与槽的形参要一样,但是参数不一样在Qt中其实也允许发生