QT:信号和槽01
QT中什么是信号和槽
概念解释
在 Qt 中,信号(Signals)和槽(Slots)是一种用于对象间通信的机制。信号是对象发出的事件通知,而槽是接收并处理这些通知的函数。
例如,当用户点击一个按钮时,按钮对象会发出一个 “clicked” 信号,这个信号可以连接到一个槽函数,槽函数可以是任何具有合适参数的成员函数,当信号被发射时,与之连接的槽函数就会被自动调用。
信号(Signals)
定义:信号是一个成员函数的声明,它只需要声明,不需要(也不应该)在类的定义中实现。信号没有函数体,它的声明使用signals关键字。
新建项目
完成后双击widget.ui文件
在设计模式中往界面上添加一个Label和一个Push Button
更改Label的显示文本为“主界面就是我!”,更改按钮的显示文本为“切换子窗口”
回到编辑模式打开widget.h文件,在Widget类定义的最后添加槽的声明:
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;public slots:void showChildDialog();
};
#endif // WIDGET_H
槽一般使用slots关键字进行修饰,这里使用public slots 表示这个槽可以在类外被调用,现在需要实现该槽函数,快捷键是Alt+回车键,选择“重构→在widget.cpp添加定义”菜单项,编辑器便会转到widget.cpp文件中
编辑器便会转到widget.cpp文件中
#include "widget.h"
#include "ui_widget.h"
#include <QDialog>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(ui->pushButton,&QPushButton::clicked,this,&Widget::showChildDialog);
}Widget::~Widget()
{delete ui;
}void Widget::showChildDialog()
{QDialog *dialog = new QDialog(this);dialog->resize(400,400);dialog->setWindowTitle(tr("子窗口"));dialog->show();
}
然后在Widget类的构造函数添加信号和槽的关联:
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(ui->pushButton,&QPushButton::clicked,this,&Widget::showChildDialog);
}
connect函数中的4个参数分别是发射信号的对象、发射的信号、接收信号的对象和要执行的槽。运行程序,然后单击主界面上的按钮,会弹出一个对话框。
自动关联
将showChildDialog重新命名为on_pushButton_clicked(),就是由字符on、发射信号的部件对象名和信号名组成
在Widget类的构造函数中删除connect()函数,
统一更改函数名快捷键:先在showChildDialog上右击,在弹出的快捷菜单中选择“重构→重命名光标所在符号”,或者直接按下Ctrl+Shift+R快捷键,在出现的替换栏中输入on_pushButton_clicked,再单击Replace按钮就可以了。
现在运行程序,和前面的效果是一样的。
自动关联的方式比较简单,对于不是在Qt设计器中往界面上添加的部件,就要在调用setupUi()函数前定义该部件,而且要使用setObjectName()函数指定部件的对象名,这样才可以使用自动关联。在编写程序时一般使用第一种方式。
自定义对话框
首先向该项目中添加Qt设计器界面类。界面模板选择Dialog without Buttons,类名改为MyDialog。完成后在设计模式中向窗口上添加两个Push Button,并且分别更改其显示文本为“进入主界面”和“退出程序”。
使用设计器来实现“退出程序”按钮的信号和槽的关联。单击设计器
按下快捷键F4,则进入了部件的信号和槽的编辑模式。在“退出程序”按钮上按住鼠标左键,然后拖动到主窗口界面上,这时松开鼠标左键。在弹出的“配置连接 - Qt Creator”对话框中,选中“显示从QWidget继承的信号和槽”复选框,然后在左边的QPushButton栏中选择信号clicked(),在右边的QDialog栏中选择对应的槽close(),完成后单击“确定”按钮,
要想取消这个关联,只需在信号和槽编辑模式中选择这个关联,当它变为红色时,按下Delete键,或者右击后选择“删除”菜单项
设置好关联后,按下F3键,或者单击“编辑控件”图标,则回到部件编辑模式
设置“进入主界面”按钮的信号和槽的关联
在该按钮上右击,在弹出的快捷菜单中选择“转到槽”,然后在弹出的对话框中选择clicked()信号,并单击“确定”按钮。这时便会进入编辑模式,并且定位到自动生成的on_pushButton_clicked()槽中。在其中添加代码
mydialog.cpp
#include "mydialog.h"
#include "ui_mydialog.h"myDialog::myDialog(QWidget *parent): QDialog(parent), ui(new Ui::myDialog)
{ui->setupUi(this);
}myDialog::~myDialog()
{delete ui;
}void myDialog::on_pushButton_clicked()
{accept();
}
这里讲述了两种关联信号和槽的方法,第一种方法是直接在设计器中进行关联,这更适合在设计器中的部件间进行。第二种方法是在设计器中直接进入相关信号的槽,这与前面讲到的手写函数是一样的,它用的就是自动关联,这样也会在.h文件中自动添加该槽的声明,我们只需更改其实现代码就可以了。在以后的章节中,如果在设计器中添加的部件要使用信号和槽,一般会使用第二种方法。
在主界面中使用自定义的对话框
首先更改main.cpp文件内容如下
#include "widget.h"#include <QApplication>
#include "mydialog.h"
int main(int argc, char *argv[])
{QApplication a(argc, argv);// Widget w;// w.show();// return a.exec();myDialog dialog;// 创建新对象if(dialog.exec() == QDialog::Accepted){Widget w;w.show();return a.exec();}else{return 0;}}
在主函数中建立了MyDialog对象,然后判断其exec()函数的返回值,如果是按下了“进入主界面”按钮,返回值应该是QDialog::Accepted,就显示主界面,并且正常执行程序;如果不是,则直接退出程序。
运行程序后可以发现,已经实现了从登录对话框到主界面,再从主界面显示一个对话框的应用了。
实现从主界面重新进入登录界面的功能
双击widget.ui文件,在设计模式中再向界面上添加两个Push Button,分别更改它们的显示文本为“重新登录”和“退出”。
然后使用信号和槽模式将“退出”按钮的clicked()信号和Widget界面的close()槽关联。
完成后再转到“重新登录”按钮的clicked()信号的槽,并更改如下。
void Widget::on_pushButton_2_clicked()
{close();myDialog dlg;if(dlg.exec() == QDialog::Accepted){show();}
}
需要说明的是,close()槽不一定使程序退出,只有当剩下最后一个主界面(就是没有父窗口的界面)时调用close()槽,程序才会退出;而其他情况下界面只是隐藏起来了,并没有被销毁。这里还需要包含MyDialog类的头文件#include “mydialog.h”,最后可以运行程序查看效果。
参考
《零基础学Ot 6编程》
相关文章:

QT:信号和槽01
QT中什么是信号和槽 概念解释 在 Qt 中,信号(Signals)和槽(Slots)是一种用于对象间通信的机制。信号是对象发出的事件通知,而槽是接收并处理这些通知的函数。 例如,当用户点击一个按钮时&#…...

针对Qwen-Agent框架的Function Call及ReAct的源码阅读与解析:Agent基类篇
文章目录 Agent继承链Agent类总体架构初始化方法`__init__` 方法:`_init_tool` 方法:对话生成方法`_call_llm` 方法:工具调用方法`_call_tool` 方法:`_detect_tool` 方法:整体执行方法`run` 方法:`_run` 方法:`run_nonstream` 方法总结回顾本文在 基于Qwen-Agent框架的Functio…...

XML 查看器:深入理解与高效使用
XML 查看器:深入理解与高效使用 XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。它通过使用标签来定义数据结构,使得数据既易于人类阅读,也易于机器解析。在本文中,我们将探讨 XML 查看器的功能、重要性以及如何高效使用它们。 什么是 XML 查看器? XML 查看…...

《Vue零基础入门教程》第十五课:样式绑定
往期内容 《Vue零基础入门教程》第六课:基本选项 《Vue零基础入门教程》第八课:模板语法 《Vue零基础入门教程》第九课:插值语法细节 《Vue零基础入门教程》第十课:属性绑定指令 《Vue零基础入门教程》第十一课:事…...

以AI算力助推转型升级,暴雨亮相CCF中国存储大会
2024年11月29日-12月1日,CCF中国存储大会(CCF ChinaStorage 2024)在广州市长隆国际会展中心召开。本次会议以“存力、算力、智力”为主题,由中国计算机学会(CCF)主办,中山大学计算机学院、CCF信…...

【VMware】Ubuntu 虚拟机硬盘扩容教程(Ubuntu 22.04)
引言 想装个 Anaconda,发现 Ubuntu 硬盘空间不足。 步骤 虚拟机关机 编辑虚拟机设置 扩展硬盘容量 虚拟机开机 安装 gparted sudo apt install gparted启动 gparted sudo gparted右键sda3,调整分区大小 新大小拉满 应用全部操作 调整完成...

3D Bounce Ball Game 有什么技巧吗?
关于3D Bounce Ball Game(3D弹球游戏)的开发,以下是一些具体的技巧和实践建议: 1. 物理引擎的使用: 在Unity中,使用Rigidbody组件来为游戏对象添加物理属性,这样可以让物体受到重力影响并发…...

【SQL】实战--组合两个表
题目描述 表: Person ---------------------- | 列名 | 类型 | ---------------------- | PersonId | int | | FirstName | varchar | | LastName | varchar | ---------------------- personId 是该表的主键(具有唯一值的列)…...

Spring基于注解实现 AOP 切面功能
前言 在Spring AOP(Aspect-Oriented Programming)中,动态代理是常用的技术之一,用于在运行时动态地为目标对象生成代理对象, 并拦截其方法调用。Spring AOP 默认使用两种类型的动态代理机制:JDK 动态代理和…...

设计模式 更新ing
设计模式 1、六大原则1.1 单一设计原则 SRP1.2 开闭原则1.3 里氏替换原则1.4 迪米特法则1.5 接口隔离原则1.6 依赖倒置原则 2、工厂模式 1、六大原则 1.1 单一设计原则 SRP 一个类应该只有一个变化的原因 比如一个视频软件,区分不同的用户级别 包括访客࿰…...

Elasticsearch 进阶
核心概念 索引(Index) 一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母),并且当我们要对这个索…...

【AI】Sklearn
长期更新,建议关注、收藏、点赞。 友情链接: AI中的数学_线代微积分概率论最优化 Python numpy_pandas_matplotlib_spicy 建议路线:机器学习->深度学习->强化学习 目录 预处理模型选择分类实例: 二分类比赛 网格搜索实例&…...

通过 JNI 实现 Java 与 Rust 的 Channel 消息传递
做纯粹的自己。“你要搞清楚自己人生的剧本——不是父母的续集,不是子女的前传,更不是朋友的外篇。对待生命你不妨再大胆一点,因为你好歹要失去它。如果这世上真有奇迹,那只是努力的另一个名字”。 一、crossbeam_channel 参考 crossbeam_channel - Rust crossbeam_channel…...

【老白学 Java】对象的起源 Object
对象的起源 Object 文章来源:《Head First Java》修炼感悟。 上一篇文章中,老白学习了抽象类和抽象方法,不禁感慨,原来 Java 还可以这样玩。 同时又有了新的疑问,这些父类从何而来的? 本篇文章老白来聊一聊…...

Ubuntu Linux操作系统
一、 安装和搭建 Thank you for downloading Ubuntu Desktop | Ubuntu (这里我们只提供一个下载地址,详细的下载安装可以参考其他博客) 二、ubuntu的用户使用 2.1 常规用户登陆方式 在系统root用户是无法直接登录的,因为root用户的权限过…...

SpringBoot 打造的新冠密接者跟踪系统:企业复工复产防疫保障利器
摘 要 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古…...

嵌入式Linux(SOC带GPU树莓派)无窗口系统下搭建 OpenGL ES + Qt 开发环境,并绘制旋转金字塔
树莓派无窗口系统下搭建 OpenGL ES Qt 开发环境,并绘制旋转金字塔 1. 安装 OpenGL ES 开发环境 运行以下命令安装所需的 OpenGL ES 开发工具和库: sudo apt install cmake mesa-utils libegl1-mesa-dev libgles2-mesa-dev libdrm-dev libgbm-dev2. 安…...

webGL入门教程_06变换矩阵与绕轴旋转总结
变换矩阵与绕轴旋转总结 目录 1. 变换矩阵简介2. 平移矩阵3. 缩放矩阵4. 旋转矩阵 4.1 绕 Z 轴旋转4.2 绕 X 轴旋转4.3 绕 Y 轴旋转 5. 组合变换矩阵6. 结论 1. 变换矩阵简介 在计算机图形学中,变换矩阵用于在三维空间中对物体进行操作,包括ÿ…...

生成树详解(STP、RSTP、MSTP)
目录 1、STP 1.概述 2.基本概念 3.端口角色及其作用 4.报文结构 5.STP的端口状态 6.三种定时器 7.STP选举步骤 8.配置BPDU的比较原则 9.TCN BPDU 10.临时环路的问题 11.传统STP的不足 拓扑变更处理过程 2、RSTP 1.端口角色 2.端口状态 3.P/A(Propo…...

【QNX+Android虚拟化方案】128 - QNX 侧触摸屏驱动解析
【QNX+Android虚拟化方案】128 - QNX 侧触摸屏驱动解析 一、QNX 侧触摸屏配置基于原生纯净代码,自学总结 纯技术分享,不会也不敢涉项目、不泄密、不传播代码文档!!! 本文禁止转载分享 !!! 汇总链接:《【QNX+Android虚拟化方案】00 - 系列文章链接汇总》 本文链接:《【…...

C#中的集合初始化器
C#中的集合初始化器是一种简洁的语法,允许在声明集合的同时初始化其元素。这种语法特别适用于初始化实现了IEnumerable接口并具有Add方法的集合类型,如List<T>、Dictionary<TKey, TValue>等。 集合初始化器的基本用法 集合初始化器的基本语…...

cartographer建图与定位应用
文章目录 前言一、安装cartographer1.安装环境2.源码编译2.1 下载2.2 编译 二、gazebo仿真2d建图0.准备仿真环境1.编写lua文件2.编写启动文件3.建图保存 三、cartographer定位 move_base导航3.1 编写启动文件3.2 启动launch 总结 前言 本文介绍cartographer在ubuntu18.04下的…...

专业解析 .bashrc 中 ROS 工作空间的加载顺序及其影响 ubuntu 机器人
专业解析 .bashrc 中 ROS 工作空间的加载顺序及其影响 在使用 ROS(Robot Operating System)进行开发时,通常会涉及多个 Catkin 工作空间(Catkin Workspace)。这些工作空间包含不同的 ROS 包和节点,可能相互…...

Apache Doris 现行版本 Docker-Compose 运行教程
特别注意!Doris On Docker 部署方式仅限于开发环境或者功能测试环境,不建议生产环境部署! 如有生产环境或性能测试集群部署诉求,请使用裸机/虚机部署或K8S Operator部署方案! 原文阅读:Apache Doris 现行版…...

Flink四大基石之窗口(Window)使用详解
目录 一、引言 二、为什么需要 Window 三、Window 的控制属性 窗口的长度(大小) 窗口的间隔 四、Flink 窗口应用代码结构 是否分组 Keyed Window --键控窗 Non-Keyed Window 核心操作流程 五、Window 的生命周期 分配阶段 触发计算 六、Wi…...

NGINX配置https双向认证(自签一级证书)
一 生成自签证书 以下是生成自签证书(包括服务端和客户端的证书)的步骤,以下命令执行两次,分别生成客户端和服务端证书和私钥。具体执行可以先建两个目录client和server,分别进入到这两个目录下执行下面的命令。 生成私钥: 首先&…...

Flink双流Join
在离线 Hive 中,我们经常会使用 Join 进行多表关联。那么在实时中我们应该如何实现两条流的 Join 呢?Flink DataStream API 为我们提供了3个算子来实现双流 join,分别是: join coGroup intervalJoin 下面我们分别详细看一下这…...

【数据结构实战篇】用C语言实现你的私有队列
🏝️专栏:【数据结构实战篇】 🌅主页:f狐o狸x 在前面的文章中我们用C语言实现了栈的数据结构,本期内容我们将实现队列的数据结构 一、队列的概念 队列:只允许在一端进行插入数据操作,在另一端…...

基于web的海贼王动漫介绍 html+css静态网页设计6页+设计文档
📂文章目录 一、📔网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站演示 五、⚙️网站代码 🧱HTML结构代码 💒CSS样式代码 六、🔧完整源码下载 七、📣更多 一、&#…...

2022 年 9 月青少年软编等考 C 语言三级真题解析
目录 T1. 课程冲突T2. 42 点思路分析T3. 最长下坡思路分析T4. 吃糖果思路分析T5. 放苹果思路分析T1. 课程冲突 此题为 2021 年 9 月三级第一题原题,见 2021 年 9 月青少年软编等考 C 语言三级真题解析中的 T1。 T2. 42 点 42 42 42 是: 组合数学上的第 5 5 5 个卡特兰数字…...