文章目录
- 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_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic: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_Hwidget.c
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 在构造函数中是一种常见的做法,因为这样可以确保在对象被创建并初始化之后,信号和槽的连接就已经建立好了。//这样,当信号被触发时,相应的槽函数可以立即被调用。// this,是当前的Widget对象(当前窗口对象)// qt4QObject::connect(ui->conn1, SIGNAL(clicked()), this, SLOT(on_clicked1()));// lambda [=] 捕获列表,这表示它按值捕获所有外部变量, 信号接受对象为当前对象QObject::connect(ui->conn2, &QPushButton::clicked, [=]() {qDebug() << "conn2";});// qt5QObject::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 打开又关闭,控制台打印相关参数和信息