【Qt秘籍】[009]-自定义槽函数/信号
自定义槽函数
在Qt中自定义槽函数是一个直接的过程,槽函数本质上是类的一个成员函数,它可以响应信号。所谓的自定义槽函数,实际上操作过程和定义普通的成员函数相似。以下是如何在Qt中定义一个自定义槽函数的步骤:
步骤 1: 定义槽函数
- 选择位置: 槽函数通常定义在类的声明部分。在Qt 5及以上版本中,虽然不是强制要求,但传统上槽函数会放置在
public slots:
区域下。如果希望保持代码的清晰度和一致性,这样做是个好习惯。
class MyClass : public QWidget {Q_OBJECT // 必须包含,以便使用信号和槽机制public:MyClass(QWidget *parent = nullptr);~MyClass();public slots: // 槽函数区域void myCustomSlot(); // 自定义槽函数声明
};
步骤 2: 实现槽函数
接下来,在类的实现文件(.cpp
)中为槽函数提供具体的实现。
void MyClass::myCustomSlot() {qDebug() << "自定义槽函数被调用了!";// 在这里可以添加代码
}
步骤 3: 连接信号到槽
为了让槽函数响应特定的信号,你需要使用QObject::connect()
函数来建立信号和槽之间的连接。
MyClass myObject;
QPushButton button("点击我", &myObject);// 连接按钮的clicked()信号到自定义槽函数
connect(&button, &QPushButton::clicked, &myObject, &MyClass::myCustomSlot);
在这个例子中,当按钮被点击时,myCustomSlot
槽函数就会被调用。
注意事项:
- 确保你的类包含
Q_OBJECT
宏,这是使用信号和槽机制的前提。- Qt 5开始支持lambda表达式作为槽函数,这为编写更简洁的代码提供了可能。
- 如果你的槽函数不需要访问类的成员或不需要作为对象的成员存在,也可以声明为全局函数或静态成员函数。
- 使用新式连接语法(如上述示例所示),它提供了类型安全和更好的编译时检查。
图形化界面
实际上,Qt的图形化界面让你能更加轻松的自定义槽函数。
步骤:
1.当你使用图形化界面直接拖拽一个pushbutton,右键点击可以发现可以直接 "转到槽..."
2.直接点击 clicked() ==> OK
3.Qt Creator 直接生成好了函数定义和声明,因此我们可以直接在此函数内部编写代码即可。
//widget.hprivate slots:void on_pushButton_clicked();//widget.cppvoid Widget::on_pushButton_clicked()
{//在此处补充你的代码
}
如下图笔者给出的示例代码,当点击new按钮会使得左上角文字替换
问题:
为什么"转到槽..."(Go To Slot...)能在没有添加connect的情况下,将组件和函数关联起来?
回答:
"转到槽函数"(Go To Slot)是Qt Creator集成开发环境(IDE)提供的一项便捷功能,它允许开发者通过图形界面快速创建槽函数并自动关联到特定组件的信号上,而无需手动编写connect()
代码行。这一自动化过程基于Qt的元对象系统(Meta-Object System)和Qt Creator对UI文件(如.ui
文件)的处理机制。
当你在Qt Designer中右键点击一个控件并选择"转到槽..."(Go To Slot...),IDE会自动执行以下操作:
生成槽函数: 如果你选择了一个预定义的信号(比如按钮的
clicked()
信号),Qt Creator会检查你的类是否已经有一个与之匹配的槽函数(命名规则通常是on_控件对象名_信号名()
)。如果没有,IDE会提示你创建这样一个槽函数,并自动生成相应的函数声明和定义。自动连接: 对于遵循特定命名约定的槽函数,Qt Creator和moc(Meta-Object Compiler)会在编译时自动处理信号与槽的连接。这意味着,如果你按照约定命名了槽函数,即使你在代码中没有显式看到
connect
调用,信号和槽也会在运行时正确地关联起来。UI文件处理: 当UI文件被编译为对应的C++代码(通常通过
uic
工具),这些自动关联的信息会被嵌入到生成的代码中,从而确保信号和槽在应用程序运行时能够正确交互。
因此,虽然表面上看起来没有手动添加connect()
调用,但实际上是在IDE和编译流程中隐式完成了信号与槽的连接工作,确保了组件和函数能够正确关联。
自定义信号
在Qt中自定义信号涉及以下几个简单步骤:
步骤 1: 声明信号
- 定义信号: 在类的声明中,你需要在
signals:
区域声明你的自定义信号。信号通常返回类型为void
,并且不需要实现(即没有函数体)。
class MyClass : public QObject {Q_OBJECT // 必须包含,以便使用信号和槽机制public:MyClass(QObject *parent = nullptr);signals: // 信号区域void customSignal(int value); // 自定义信号声明,参数可以根据需要设定
};
步骤 2: 发射信号
在类的实现中,你可以使用emit
关键字来触发(发射)信号。通常,这会在某个特定条件满足或者事件发生时执行。
MyClass::MyClass(QObject *parent) : QObject(parent) {// 在适当的位置发射信号,例如初始化完成后或者某个事件响应时emit customSignal(42);
}
或者在类的其他成员函数内部根据需要发射信号:
void MyClass::someFunction() {// 根据逻辑判断发射信号if (someCondition) {emit customSignal(getSomeValue());}
}
注意事项:
- 确保类定义中包含了
Q_OBJECT
宏,这是使用信号和槽机制的基础。- 信号可以有任意数量和类型的参数,但不能有默认值,且返回类型必须是
void
。- 信号的命名通常以“signal”结尾,尽管这不是强制性的,但这样的命名约定有助于代码的可读性。
- 发射信号是线程安全的,即使在非主线程中也可以安全地发射信号。
通过以上步骤,你就成功地在Qt中自定义并使用了一个信号。记得连接这个信号到相应的槽函数以完成对象间的通信。
相关文章:

【Qt秘籍】[009]-自定义槽函数/信号
自定义槽函数 在Qt中自定义槽函数是一个直接的过程,槽函数本质上是类的一个成员函数,它可以响应信号。所谓的自定义槽函数,实际上操作过程和定义普通的成员函数相似。以下是如何在Qt中定义一个自定义槽函数的步骤: 步骤 1: 定义槽…...

HTTPS加密
一.加密是什么 加密就是把明文(要传输的信息)进行一系列的变换,生成密文. 有加密就有解密,解密就是把密文进行一系列的变换,生成明文. 在这个加密和解密过程中,往往需要一个或多个中间数据,辅助进行这个过程,这样的数据称为密钥. 加密解密到如今已经发展成了一个独立的学科 : 密…...

搭建大型分布式服务(三十八)SpringBoot 整合多个kafka数据源-支持protobuf
系列文章目录 文章目录 系列文章目录前言一、本文要点二、开发环境三、原项目四、修改项目五、测试一下五、小结 前言 本插件稳定运行上百个kafka项目,每天处理上亿级的数据的精简小插件,快速上手。 <dependency><groupId>io.github.vipjo…...
SpringBoot如何使用日志Logback,及日志等级详解
Spring Boot默认已经集成了SLF4J(Simple Logging Facade for Java)作为日志的接口,以及Logback作为日志的实现。这意味着在大多数情况下,你无需做额外的配置即可开始记录日志。 下面是一个简要的指南,包括如何在Spring…...

若依启动run-modules-system.bat报错问题解决方案
在启动run-modules-system.bat时遇到了一些问题,在网上搜索无果后,排查解决完毕 1.启动nacos时,报错如下 Error creating bean with name grpcClusterServer: Invocation of init method failed; nested exception is java.io.IOException: Failed to bind to address 0.0.0.0…...

Aws CodeCommit代码仓储库
1 创建IAM用户 IAM创建admin用户,增加AWSCodeCommitFullAccess权限 2 创建存储库 CodePipeline -> CodeCommit -> 存储库 创建存储库 3 SSH 1) window环境 3.1.1 上载SSH公有秘钥 生成SSH秘钥ID 3.1.2 编辑本地 ~/.ssh 目录中名为“config”的 SSH 配置文…...
PostgreSQL的内存参数
PostgreSQL的内存参数 基础信息 OS版本:Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本:16.2 pg软件目录:/home/pg16/soft pg数据目录:/home/pg16/data 端口:5777PostgreSQL 提供了多种内存参数&#x…...
【教程】在CentOS上使用Docker部署前后端分离项目的完整指南
当在CentOS上使用Docker部署前后端分离项目时,需要遵循一系列步骤来实现这一目标。以下是每个步骤的详细内容: 步骤1:安装Docker和Docker Compose 1.1 安装Docker 在CentOS上安装Docker,可以按照以下步骤进行: sudo yum install -y yum-utils device-mapper-persistent…...

某公司新招了个牛逼的架构师后.....
网友评论: 架构师一个响指之后。第二天,老板不见了走走停停 回头已是数月图片是我的故事没错了,本来我们组有10个人,我把代码重构之后,只要半个人维护,于是老板要裁掉9个>人,于是我被搞走了图…...
云计算和雾计算
雾计算作为传统集中式数据存储系统(云)和边缘设备之间的中间层。雾扩展了云,使计算和数据存储更接近边缘。雾由多个节点(雾节点)组成,并创建一个本地网络,使其成为一个去中心化的生态系统——雾…...
正缘画像 api数据接口
测测正缘画像,相貌特征,高矮胖瘦,黑白美丑,对方何许人也,远嫁近娶,何方定居,家庭观,持家爱家,生活质量,富裕贫穷,健康情况,测算结果仅…...
Java 基础面试300题 (171- 200)
Java 基础面试300题 (171- 200) 171.什么是同步? 当多个线程试图同时访问共享资源时,那么他们需要以某种方式让资源一次只能由一个线程访问。实现这一目标的过程被称为同步。Java提供了一个名为synchronized的关键字实现这一目标…...

0基础学习Elasticsearch-使用Java操作ES
文章目录 1 背景2 前言3 Java如何操作ES3.1 引入依赖3.2 依赖介绍3.3 隐藏依赖3.4 初始化客户端(获取ES连接)3.5 发送请求给ES 1 背景 上篇学习了0基础学习Elasticsearch-Quick start,随后本篇研究如何使用Java操作ES 2 前言 建议通篇阅读再回…...
【Linux】GNU编译器基础
文章目录 GCCMakefile、make GCC 常见的GNU编译器是GCC其包含gcc以及g等,适用于C/C中,在Windows系统中通常使用IDE进行程序的编写和编译、链接等操作,但在Linux系统中通常使用GNU编译器来进行,对于C/C等高级语言需要进行预编译、编…...
Linux 软件安装:从源码编译到包管理器安装
Linux 软件安装:从源码编译到包管理器安装 在 Linux 操作系统中,软件安装是一个非常重要的任务。不同的软件安装方式有不同的优缺点,本篇博客将介绍 Linux 软件安装的几种方式,包括从源码编译安装、使用包管理器安装和使用第三方…...

Python3 match-case 语句
前言 本文主要介绍match-case语句与switch-case的区别,及match-case语句的基本用法。 文章目录 前言一、switch-case 和match-case的区别二、match-case的基本用法1、可匹配的数据类型2、多条件匹配3、通配符匹配 一、switch-case 和match-case的区别 C语言里面s…...
图论第三天
似乎要团建了,我再猫会。我必须参与上团建再走。 130.被围绕的区域 先把外围的O变成A,再把飞地的O变成X,再把外围A变回O class Solution { public:int neighbor[4][2] {1,0,0,-1,-1,0,0,1};void solve(vector<vector<char>>&a…...

计算机网络学习2
文章目录 信道复用技术 第三章数据链路层概述数据链路层的三个重要问题封装成帧和透明传输差错检测可靠传输的相关基本概念可靠传输的实现机制停止等待协议回退N帧协议选择重传协议 点对点协议PPP共享式以太网网络适配器和MAC地址CSMA_CD协议的基本原理共享式以太网的争用期共享…...

unittest框架
目录 框架: unittest框架: 使用的原因: 核心要素(组成): TestCase测试用例: 可能出现的错误: TestSuite(测试套件): TestRunner(测试执行): 整体步骤: 查看执行结果: TestLoader测试加载: 方法级别Fixture: 类级别Fixture: 模块级别Fixture: 用例脚本…...
Python中的__str__和__repr__:揭示字符串表示的奥秘
标题:Python中的__str__和__repr__:揭示字符串表示的奥秘 摘要 在Python中,对象的字符串表示对于调试和日志记录至关重要。__str__和__repr__是两个特殊的方法,用于定义对象的字符串表示形式。尽管它们在功能上相似,…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...

android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

若依登录用户名和密码加密
/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...