当前位置: 首页 > news >正文

Qt按键响应

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

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

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

简单的信号与槽构建示例

+-构建

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

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

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

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

Edit Signals块

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

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

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

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

代码方式实现

ui+代码

右键按钮,点击“转到槽”

选择信号,点击“OK”

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

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

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

QObject::connect函数

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

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

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

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

函数实现

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

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

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

 lambda表达式

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

点击“保存”键后输出如下

 使用函数指针

与使用connect函数构建相似,不再赘述,给出widget.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代码如下

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

http://www.dtcms.com/a/313873.html

相关文章:

  • 更智能的 RibbonBar Spread.NET 18.2Crack
  • QT:交叉编译mysql驱动库
  • 基于鼠标位置的相机缩放和平移命令的实现(原理+源码)
  • Prompt Engineering
  • 赛博威携手Dify,助力AI在企业的场景化落地
  • 【数据库】使用Sql Server创建索引优化查询速度,一般2万多数据后,通过非索引时间字段排序查询出现超时情况
  • Linux(centos)安全狗
  • Linux 用户与组管理全解析
  • 采购管理工具的实施方法论:三阶段框架与常见问题解决方案
  • RHCA02
  • How To Say - AI多语言表达工具
  • 【前端:Html】--1.3.基础语法
  • el-table高度自适应vue页面指令
  • 第二十三天(APP应用产权渠道服务资产通讯抓包静态提取动态调试测试范围)
  • Jetbrains IDE总是弹出“需要身份验证”窗口
  • 算法11. 盛最多水的容器
  • leetcode-sql-3497分析订阅转化
  • 优选算法 力扣 11. 盛最多水的容器 双指针降低时间复杂度 贪心策略 C++题解 每日一题
  • 验证码等待时间技术在酒店自助入住、美容自助与社区场景中的应用必要性研究—仙盟创梦IDE
  • Flask + HTML 项目开发思路
  • 【BUUCTF系列】[极客大挑战 2019]LoveSQL 1
  • 同质无向加权图:理论基础、算法演进与应用前沿
  • MySQL偏门但基础的面试题集锦
  • 理解 JavaScript 中的“ / ”:路径、资源与目录、nginx配置、请求、转义的那些事
  • IM消息数据库调研
  • Lecture 1 Overview and Tokenization 课程笔记
  • Go语言select
  • Redis真的是单线程的吗?
  • 跟着顶刊学写论文-摘要1
  • codeBuddy IDE 使用教程