文章目录
- 1.通过Singloat and Slots Editor 添加信号与槽
- 2. 通过拖动动态添加
- 3.通过转到槽方式添加(自动关联)
- 4. 自定义信号与槽(connect)
- 4.1 connect方式
- 4.2 自定义信号
1.通过Singloat and Slots Editor 添加信号与槽
点添加,然后修改对应信息
选择对应的button作为发送者
使用点击事件
选窗口widget做信号接收者
选关闭窗口作为槽函数
点击按钮窗口关闭
实现原理:
在设计文件对应的属性中会生成关联描述信息
2. 通过拖动动态添加
点Edit Singnals/Slots 操作按钮
点drag按钮向外拖,连接到widget,并显示出editor按钮之前在修改栏添加的信号与槽, 添加点击事件信号和关闭事件槽,运行后点击窗口关闭
修改完成后点击此按钮退出编辑
3.通过转到槽方式添加(自动关联)
右键按钮,选转到槽
选择点击事件
会在Widget 自动生成槽函数,
点击在应用输出中打印信息
实现原理:qt会自动关联信号与槽
会自动生成如下格式的槽函数:on_子对象名_信号名
以上槽函数名称不对应原因是在对象查看区修改的button对象名称未保存生效,在属性编辑区还是pushButton
给drag按钮转到槽,生成对应的槽函数
4. 自定义信号与槽(connect)
4.1 connect方式
1、qt4 方式:
QObject::connect(sender,SIGNAL(signal()),receiver, SLOT(slot()));
使用SIGNAL 和 SLOT 这两个宏,将两个函数名转换成了字符串,connect()函数的 signal 和 slot 都是接受字符串,一旦出现连接不成功的情况是没有编译错误的(因为一切都是字符串,编译期是不检查字符串是否匹配),而是在运行时给出错误。这会增加程序的不稳定性
2. Lambda表达式
QObject::connect(sender,&Sender::signal, [=]() {/* lambda body */ });
可以直接在连接点使用匿名函数
3. qt5函数指针
QObject::connect(sender,&Sender::signal, receiver,&Receiver::slot);
类型安全,且可以利用IDE的代码补全和错误检查
4. 自动连接(UI转到槽方式)
on_<objectName>_<signalName> 命名的槽会自动连接到相应的信号
示例:
定义4个按钮
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QDebug>
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_drag_clicked();
void on_clicked1();
void on_clicked3();
void on_conn4_clicked();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.c
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 在构造函数中是一种常见的做法,因为这样可以确保在对象被创建并初始化之后,信号和槽的连接就已经建立好了。
//这样,当信号被触发时,相应的槽函数可以立即被调用。
// this,是当前的Widget对象(当前窗口对象)
// qt4
QObject::connect(ui->conn1, SIGNAL(clicked()), this, SLOT(on_clicked1()));
// lambda [=] 捕获列表,这表示它按值捕获所有外部变量, 信号接受对象为当前对象
QObject::connect(ui->conn2, &QPushButton::clicked, [=]() {
qDebug() << "conn2";
});
// qt5
QObject::connect(ui->conn3, &QPushButton::clicked, this, &Widget::on_clicked3);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_clicked1()
{
qDebug() << "conn1";
}
void Widget::on_clicked3()
{
qDebug() << "conn3";
}
// 自动连接
void Widget::on_conn4_clicked()
{
qDebug() << "conn4";
}
void Widget::on_drag_clicked()
{
}
运行结果:
4.2 自定义信号
新建Form, 在其中定义信号和槽
槽函数实现
在构造中连接和发送信号
修改主函数启动窗口
结果: widget 打开又关闭,控制台打印相关参数和信息