QT 信号与槽的简单使用

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 打开又关闭,控制台打印相关参数和信息
在这里插入图片描述

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不知所云,

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值