QT的信号与槽

提出疑问:界面上已经有的按键,怎么操作才能让用户按下按键后有操作上的反应呢?

在 Qt 中,信号和槽机制是一种非常强大的事件通信机制。这是一个重要的概念,特别是对于初学者来 说,理解它对于编写 Qt 程序至关重要。

信号 (Signals):是由对象在特定事件发生时发出的消息。例如,QPushButton 有一个 clicked() 信号,当用户点击按钮时发出。

槽 (Slots):是用来响应信号的方法。一个槽可以是任何函数,当其关联的信号被发出时,该槽函数 将被调用。

连接信号和槽:使用 QObject::connect() 方法将信号连接到槽。当信号发出时,关联的槽函数 会自动执行。

是静态成员函数,静态成员函数可以通过类名直接调用,而不需要创建类的实例。在类内部,静态成员函数也可以通过 类名::函数名 的方式进行调用,但通常直接使用 函数名 即可!

自动连接(使用UI 文件)

功能:点击PushButton按钮会关闭窗口

这种方法是由程序自动编写代码

系统自动编写的代码在这里!

连线方式(不常用)

记得勾选:显示从QWidget继承的信号与槽!!!

但它最终还是会生成下面这些信息

然后按编辑控件退出编辑信号/槽

转到槽的方式

会自动在头文件声明槽和实现槽

代码

cpp 复制代码
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //在构造函数中进行信号与槽的绑定
    //QObject::connect(sender,SIGNAL(signal()),receiver,SLOT(slot()));
    //QObject::connect(ui->pushButton_2,SIGNAL(clicked(bool)),this,SLOT(on_pushButton2_clicked()));
    connect(ui->pushButton_2,SIGNAL(clicked(bool)),this,SLOT(on_pushButton2_clicked()));
    //在类内使用静态函数不用加QObject::(类名::),因为这个Widget间接继承之QObject
    //on_pushButton2_clicked()记得先声明
}

Lambda表达式

错误写法

cpp 复制代码
    //lambda表达式QObject::connect(sender,&Sender::signal,[=](){/*lambda body*/});
    //&Sender::signal,这里的Sender是类名
    connect(ui->btn_lambda,&QPushButton::clicked(),[=](){
         qDebug()<<"lambda";
    });

你需要确保信号的参数与槽的参数完全匹配,所以对于QPushButtonclicked()信号,它是一个没有参数的信号。这意味着任何连接到这个信号的槽或lambda表达式也不能有参数。

clicked()本身是一个信号,不是一个可以调用的函数或方法。在connect函数中,你应该传递信号的地址(即&QPushButton::clicked),而不是尝试调用它。

正确写法

cpp 复制代码
    //lambda表达式QObject::connect(sender,&Sender::signal,[=](){/*lambda body*/});
    //&Sender::signal,这里的Sender是类名
    connect(ui->btn_lambda,&QPushButton::clicked,[=](){
         qDebug()<<"lambda";
    });

当使用lambda表达式作为槽时,不需要显式地指明接收者(即this)。你不需要指定一个特定的接收者对象,因为lambda表达式本身就是一个可以内联定义的函数对象。

使用函数指针

cpp 复制代码
    //函数指针方式:QObject::connect(sender,&Sender::signal,receiver,&receiver::slot);
    connect(ui->btn_pointer,&QPushButton::clicked,this,&Widget::on_btnPointer_clicked);
cpp 复制代码
private slots:
    void on_btnPointer_clicked();
cpp 复制代码
void Widget::on_btnPointer_clicked()
{
    qDebug()<<"pointer";
}
相关推荐
echoarts9 分钟前
Rayon Rust中的数据并行库入门教程
开发语言·其他·算法·rust
Aomnitrix28 分钟前
知识管理新范式——cpolar+Wiki.js打造企业级分布式知识库
开发语言·javascript·分布式
每天回答3个问题1 小时前
UE5C++编译遇到MSB3073
开发语言·c++·ue5
伍哥的传说1 小时前
Vite Plugin PWA – 零配置构建现代渐进式Web应用
开发语言·前端·javascript·web app·pwa·service worker·workbox
小莞尔2 小时前
【51单片机】【protues仿真】 基于51单片机八路抢答器系统
c语言·开发语言·单片机·嵌入式硬件·51单片机
我是菜鸟0713号2 小时前
Qt 中 OPC UA 通讯实战
开发语言·qt
JCBP_2 小时前
QT(4)
开发语言·汇编·c++·qt·算法
Brookty2 小时前
【JavaEE】线程安全-内存可见性、指令全排序
java·开发语言·后端·java-ee·线程安全·内存可见性·指令重排序
百锦再2 小时前
[特殊字符] Python在CentOS系统执行深度指南
开发语言·python·plotly·django·centos·virtualenv·pygame
Anson Jiang2 小时前
浏览器标签页管理:使用chrome.tabs API实现新建、切换、抓取内容——Chrome插件开发从入门到精通系列教程06
开发语言·前端·javascript·chrome·ecmascript·chrome devtools·chrome插件