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

相关推荐
Hello eveybody几秒前
介绍最大公因数和最小公约数(C++)
java·开发语言·c++
ckhcxy1 分钟前
抽象类和接口
java·开发语言
我头发多我先学7 分钟前
C++ AVL 树:平衡原理到完整实现(自平衡二叉搜索树)
开发语言·数据结构·c++·算法
@小柯555m7 分钟前
算法(字母异位词分组)
java·开发语言·算法·leetcode
故事和你9110 分钟前
洛谷-算法2-1-前缀和、差分与离散化2
开发语言·数据结构·算法·深度优先·动态规划·图论
郝学胜-神的一滴13 分钟前
epoll 边缘触发 vs 水平触发:从管道到套接字的深度实战
linux·服务器·开发语言·c++·网络协议·unix
AI人工智能+电脑小能手24 分钟前
【大白话说Java面试题】【Java基础篇】第9题:HashMap根据key查询元素的时间复杂度是多少
java·开发语言·数据结构·后端·面试·哈希算法·哈希表
invicinble28 分钟前
对于java面向对象的知识
java·开发语言
2501_9307077828 分钟前
使用C#代码在 PowerPoint 中创建组合图表
开发语言·c#·powerpoint
干洋芋果果30 分钟前
前端学python
开发语言·前端·python