Qt按键响应

信号与槽机制是一个非常强大的事件通信机制,是 Qt 最核心的机制之一,初学者掌握它之后,几乎可以做任何交互操作。

信号(Signal) 是一种"事件"或"通知",比如按钮被点击、文本改变、窗口关闭等。
槽(Slot) 是一个"处理函数",用于响应信号。

当信号发生时,自动调用连接的槽函数,实现逻辑响应。

简单的信号与槽构建示例

+-构建

如果你的栏布局与主包一样,如下

在黑框右键,点击"重置为默认布局",就能出现如下"+""-"号

点击"+"号,双击(<发送者>等)输入内容,示例为点击打开按钮,就关闭窗口

点击要删除的命令,再点击"-"号就能删除

Edit Signals块

我觉得使用相对麻烦,就不详细介绍了,大家可以不学这种。

点击符号后,将鼠标放在对象上会变红,点击要选择的信号发送者

点击后会由对象伸出一条红色的单项箭头,点击要选择的接收者,选择发送者发出的信号和接收者的响应操作

点击左边的Edit Widgets退出编辑操作

代码方式实现

ui+代码

右键按钮,点击"转到槽"

选择信号,点击"OK"

就跳转到了widget.cpp文件,会自动生成相关槽函数,.h文件也会增添相应声明

我们可以在槽函数里输出一句话(记得在.h文件增添头文件<iostream>),保存

点击"打开"按钮后出现如下输出

QObject::connect函数

在构造函数中进行信号与槽的绑定

打开widget.cpp,输入如下连接代码

cpp 复制代码
QObject::connect(发送者,SIGNAL(检测信号),接收者,SLOT(超函数));

this代表这个窗口 ,SLOT()超函数需在头文件声明

函数实现

声明后右键函数,点击"Refactor",点击"在widget.cpp中添加定义"

在跳转后的widget.cpp中的生成函数中输入如下代码

点击"关闭"按钮后,输出如下

lambda表达式

也可以直接写lambda表达式,就不用声明函数了(是匿名函数),接收者this要不需要写,默认为窗体本身

点击"保存"键后输出如下

使用函数指针

与使用connect函数构建相似,不再赘述,给出widget.cpp文件中的代码

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代码如下

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中其实也允许发生

相关推荐
caimouse几秒前
ReactOS 图形系统分析(50):画笔子系统 — pen.c
c语言·开发语言·stm32
caimouse31 分钟前
ReactOS 图形系统分析(48):弧线绘制 — arc.c
c语言·开发语言
cypking2 小时前
Objective-C 语法完整学习手册(小白自学 + 开发备查)
c语言·开发语言·学习·objective-c
ambition202423 小时前
操作系统同步:读者-写者问题与读写公平法详解(附每个 PV 操作含义)
linux·开发语言·数据结构·unix
chuan.bai6 小时前
Java RAG 实战(第 11 篇):RAG 知识工作台网页
java·开发语言·人工智能
离陌在学C#8 小时前
C# 事件(Event)详解:从概念到实战
开发语言·c#
Terra.K9 小时前
Java异常学习[特殊字符]
java·开发语言·学习
葡萄城技术团队10 小时前
InfluxDB 2\.x 深度解析:核心架构、Flux 函数与制造业落地指南(三)
java·开发语言·架构
counting money10 小时前
Java IO流详解:从InputStream到文件操作实战
java·开发语言·python
wuyk55511 小时前
98.C语言易混难点:字符数组与字符串指针的底层差异
c语言·开发语言·c++·stm32·嵌入式硬件·算法