Qt中自定义信号与槽

news/2025/1/23 14:21:58/

在学习信号和槽的时候,我们知道信号一般对应的就是用户的行为,槽指的是接受到信号后的响应,在类内有许多的内置信号和槽函数,能够去实现一些常见的行为,但实际业务开发中,尤其是接受到信号的响应会根据具体的业务逻辑有所不同,所以需要自定义信号和槽函数

1. 如何自定义槽函数

1)基于代码的方式

所谓的槽函数,其实在Qt5过后,和普通的函数没有区别,在Qt5之前,在对槽函数的定义和声明时,需要加上关键字“public/private/project solts”,例如:

slots是Qt自己扩展的关键字,像这些扩展的关键字是不属于C++语法的

*为什么Qt可以在C++的语法上拓展关键字?

因为Qt采用了元编程技术,即基于代码生成代码,qmake在创建Qt项目的时候,就会调用专门的扫描器,去扫描这些关键字,基于这些关键字生成一系列相关的代码

2)基于图形化的方式

基于图形化的方式:

通过图形化的方式,可以直接右键指定的控件,然后转到槽函数,这里包括了所有该控件内的信号(包括其父类的),选择好后会自动生成代码,跳转到槽函数的定义,如下

这种方式定义的槽函数是直接就关联好相关信号的,而不是通过connect函数进行关联的,这里是通过命名的方式,这是Qt内部做的处理,我们可以看到上面的例子,命名风格是:

on_控件变量名_关联信号名

之所以可以通过命名就关联,是因为ui生成的文件QWidget类内存在connectSlotsByName这个函数,具体的实现不做过多研究。

2. 如何自定义信号

Qt中一般很少用到自定义信号,这是由于信号一般对应用户的操作,而用户的操作是可以穷举出来的,通常的操作在Qt内都存在定义好的,但不排除有少数需要用到的时候。

所谓信号,其实本质上也是函数,但又比较特殊,信号函数的特殊:

1)只需要写出函数声明,并告诉Qt,这是一个信号即可,这个函数的定义是Qt在编写过程中,自动生成的,且不可干预,信号是Qt中的特殊机制,Qt生成的信号函数的实现要配合Qt框架做很多既定的操作,所以这个过程通常不可干预,而是又Qt自己生成,声明信号函数的方法是用到Qt拓展的关键字signals

2)作为信号函数,这个返回值必须是void,有无参数都可,甚至可以重载

例:

此外,定义好信号后,还需要定义什么时候发送信号,发送信号的方式,在Qt5之前是需要用到关键字emit的,但现在可以不用,但为了区分信号函数,最好是需要带上emit的。

具体举个例子

我先用图形化的方式创建一个按钮,并且编写这个按钮的槽函数,槽函数内容就是发送我自定义的信号。

然后我再将我自定义的信号关联到一个我自己写一个自定义槽函数上,函数功能为将界面的标题修改。

总结

本章学习了如何自定义信号和槽,了解了Qt拓展的一些关键字以及使用方式,这里做个简单总结:

public slots : 自定义槽函数用的关键字

图形化定义槽函数

on_控件名称_信号名称 : 以命名的方式关联信号和槽函数

signals:声明信号函数的关键字

emit : 表示信号发送的关键字


http://www.ppmy.cn/news/1565502.html

相关文章

【学习笔记15】如何在非root服务器中,安装属于自己的redis

一、下载安装包 官网下载黑马程序员给的安装包(redis-6.2.6) 二、将安装包上传至服务器 我将安装包上传在我的文件夹/home/XXX,指定路径中/src/local/redis/,绝对路径为/home/XXX/src/local/redis/解压安装包 XXXomega:~$ cd …

HarmonyOS NEXT:华为分享-碰一碰开发分享

随着科技的不断进步,智能手机和智能设备之间的互联互通变得越来越重要。华为作为科技行业的领军企业,一直致力于为用户提供更加便捷、高效的使用体验。HarmonyOS NEXT系统的推出,特别是其中的“碰一碰”功能,为用户带来了前所未有…

数字图像处理:实验二

任务一: 将不同像素(32、64和256)的原图像放大为像素大 小为1024*1024的图像(图像自选) 要求:1)输出一幅图,该图包含六幅子图,第一排是原图,第 二排是对应放大…

2024精编面试算法题类型之暴力枚举

输入数据包括3行. 第一行为新放入鱼的尺寸范围minSize,maxSize(1 ≤ minSize,maxSize ≤ 1000),以空格分隔。 第二行为鱼缸里面已经有鱼的数量n(1 ≤ n ≤ 50) 第三行为已经有的鱼的大小fishSize[i](1 ≤ fishSize[i] ≤ 1000),以空格分隔。 输出描述…

Qt基础项目篇——Qt版Word字处理软件

一、核心功能 本软件为多文档型程序,界面是标准的 Windows 主从窗口 拥有:主菜单、工具栏、文档显示区 和 状态栏。 所要实现的东西,均在下图了。 开发该软件,主要分为下面三个阶段 1)界面设计开发 多窗口 MDI 程序…

【STM32】-TTP223B触摸开关

前言 本文章旨在记录博主STM32的学习经验,我自身也在不断的学习当中,如果文章有写的不对的地方,欢迎各位大佬批评指正。 准备工作 今天这篇文章介绍的是触摸开关这一外围硬件。 ST-link调试器STM32最小系统板单路TTP223B触摸传感器模块LE…

迅为RK3568开发板篇OpenHarmony实操HDF驱动控制LED-添加内核编译

编译内核时将该 HDF 驱动编译到镜像中,接下来编写驱动编译脚本 Makefile,代码如下所示: 加入编译体系,填加模块目录到 drivers/hdf_core/adapter/khdf/linux/Makefile 文件 更多内容可以关注:迅为RK3568开发板篇OpenHa…

cursor重构谷粒商城05——docker容器化技术快速入门【番外篇】

前言:这个系列将使用最前沿的cursor作为辅助编程工具,来快速开发一些基础的编程项目。目的是为了在真实项目中,帮助初级程序员快速进阶,以最快的速度,效率,快速进阶到中高阶程序员。 本项目将基于谷粒商城…