【Qt】信号、槽

目录

一、信号和槽的基本概念

二、connect函数:关联信号和槽

三、自定义信号和槽

1.自定义槽函数

2.自定义信号函数

例子:

四、带参的信号和槽

例子:

五、Q_OBJECT宏

六、断开信号和槽的连接

例子:


一、信号和槽的基本概念

1.信号

信号(signal)是由于用户对窗口或控件进行某些操作,导致窗口或控件产生某种特定事件,这时窗口类/控件类会发出信号给接收信号的控件对象。

2.槽

槽(slot)是对信号响应的函数。槽就是一个函数,与一般C++函数一样,可以定义在类任何访问权限下(public、protected、private),可以带参,可以重载,但是不能有默认参数。槽函数与普通函数不同的点是:槽函数可以关联某个信号,当该信号发出时关联的槽函数会自动执行。

信号和槽要解决的问题就是响应用户的操作

下面有一个例子:我们在窗口中创建一个按钮,点击该按钮控件该按钮上的内容会在"hello world

"和"hello qt"中间切换。

使用拖拽控件的方式构建图形界面:

当使用拖拽控件的方式构建图形界面时,每个控件对象都有下图中右下角中红圈圈的部分:objectName这个里面的内容就是通过拖拽创建的控件对象的名字,可以对该名字进行修改。

在Qt中,QObject类提供了一个静态成员函数connect,该函数用于关联信号函数和槽函数。

值得注意的是:如果使用这种拖拽方式构建图形界面,此时创建的控件对象都会在Widget类中的成员变量ui所指向的类中,因此在Widget类中访问以拖拽方式创建的控件对象时,要使用ui指针访问。

使用纯代码方式构建图形界面:

 值得注意的是:如果按照纯代码方式进行构建,那么我们应该将按钮控件对象声明为Widget类的成员变量,然后再Widget的构造函数中定义,这样就可以在槽函数中对该按钮对象进行操作。 

qt中类的关系:

QObject是Qt内置的父类,Qt中大多数类都是间接或直接继承自QObject。比如QWidget就是继承自QObject因此继承自QObject的类都可以使用QObject中的静态成员函数connect以及QObject的其他成员函数。

二、connect函数:关联信号和槽

现在写一个qt项目:通过点击窗体控件中的一个按钮控件使窗体控件关闭。

如下:发送信号的控件对象是button按钮,信号函数是QPushButton::clicked,接收信号的控件是窗口Widget,槽函数是Widget::close,close函数其实是QWidget类的成员函数,由于类Widget继承自QWidget因此Widget可以使用QWidget中的所有方法。

需要注意的是:使用connect函数关联信号和槽时,信号函数必须是发送信号的控件对象的成员函数;槽函数必须是接收信号的控件对象的成员函数。

通过图标判断信号函数和槽函数:

 像信号发射的图标是信号函数,比如这个clicked函数;像锯齿形的是槽函数,比如这个click。

三、自定义信号和槽

qt内部已经有大量现成的信号函数和槽函数,但是有些时候需要我们自己定义信号函数和槽函数。

1.自定义槽函数

1.自定义槽函数的返回值是void,需要声明和实现

2.可以有参数,可以被重载。

3.可以在public slots、protected slots、priavte slots下,也允许写在public下声明。

C++纯代码(即使用connect函数)方式连接信号和槽。

上面已有这种方式实现的代码。

UI设计窗口的方式自动连接信号和槽。

1.选中拖拽的控件点击右键,点击转到槽

2.选择要连接的信号

3.qt会自动生成一个函数,通过该函数的名字自动连接信号和槽

qt自动生成的这个函数名是具有格式规则的。对于函数名on_pushButton_clicked,on_后面就是发出信号的控件对象名字,clicked就是该控件发送的信号函数(一旦用户触发pushButton对象中的QPushButton::clicked,pushButton就会发送信号)。处理信号的动作就是在这个on_pushButton_clicked函数里实现。

2.自定义信号函数

1.自定义信号函数的返回值是void,只需声明,不需要定义,qt会自动帮我们完成定义。

2.可以有参数,可以被重载。

3.必须在signals后声明。

例子:

我们通过自定义信号完成一个简单的需求:但我们点击按钮控件后,窗口标题需要发生改变。


这有个emit其实是可以不写的。

四、带参的信号和槽

对于不带参的信号和槽前面已经有了。

1.信号函数和槽函数的参数类型必须一致,个数可以不一致(信号函数的参数个数多于槽函数)。

2.发射信号的时候,就可以给信号函数传递参数,该信号函数被执行完成后,会将这个参数传递给对应的槽函数。

例子:

实现一个功能:通过UI设计窗口创建两个按钮控件pushButton_1和pushButton_2。点击pushButton_1后窗口标题变为"标题一",点击pushButton_2窗口标题变为"标题二"。如下:

如果信号和槽连接,允许两者的参数个数可以不一致(信号函数的参数个数多于槽函数),但参数类型必须一致,这样的设计相较于参数数量必须一致的好处是什么?

情况:一个槽可能连接多个信号,如果要求参数必须一致才可连接,信号绑定槽的要求就会变高,如果一个槽的参数个数是1,那么参数个数是2的信号就无法绑定槽,尽管此时信号的第一个参数类型和这个槽的参数类型相同,也无法进行连接,这就导致了信号和槽之间的连接不够灵活。

五、Q_OBJECT宏

Qt中如果要让某个类可以使用信号和槽(可以在这个类中定义信号函数和槽函数),则必须要在这个类的最开始加上Q_OBJECT。

qt创建项目后会自动qt会自动帮我们加上了这个宏,如果没加这个宏使用了信号槽则会编译出错。

六、断开信号和槽的连接

使用disconnect断开信号和槽的连接,disconnect和connect在接口上的用法基本一致。断开信号和槽的连接比较少见,调用disconnect一般是为了更换一个信号连接的槽函数,disconnect后这个信号就可以连接其他新的槽函数了。

注意:

qt中的信号和槽中支持一个信号绑定多个槽一个槽被多个信号绑定

例子:

现在要设计这样一个功能:在UI窗口设计中创建按钮pushButton和pushButton_1,点击pushButton后将窗口标题改为"这是旧窗口标题",点击pushButton_1后,然后每次点击pushButton窗口标题变为”这是新窗口标题“。如下:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/935850.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一种构建网络安全知识图谱的实用方法

文章主要工作 论述了构建网络安全知识库的三个步骤,并提出了一个构建网络安全知识库的框架;讨论网络安全知识的推演 1.框架设计 总体知识图谱框架如图1所示,其包括数据源(结构化数据和非结构化数据)、信息抽取及本体构建、网络…

JAVA后端实现全国区县下拉选择--树形结构

设计图如图&#xff1a; 直接上代码 数据库中的格式&#xff1a; JAVA实体类&#xff1a; Data public class SysAreaZoningDO {private Long districtId;private Long parentId;private String districtName;private List<SysAreaZoningDO> children; } MapperSQL语句…

青少年夏令营管理系统的设计与开发(社团管理)(springboot+vue)+文档

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

安卓低功耗蓝牙BLE官方开发例程(JAVA)翻译注释版

官方原文链接 https://developer.android.com/develop/connectivity/bluetooth/ble/ble-overview?hlzh-cn 目录 低功耗蓝牙 基础知识 关键术语和概念 角色和职责 查找 BLE 设备 连接到 GATT 服务器 设置绑定服务 设置 BluetoothAdapter 连接到设备 声明 GATT 回…

Windows 系统中的组策略编辑器如何打开?

组策略是 Windows 操作系统中用于设置计算机和用户配置的重要工具。它允许管理员控制各种系统功能&#xff0c;从桌面背景到安全设置等。对于 Windows 专业版、企业版和教育版用户来说&#xff0c;可以通过组策略编辑器&#xff08;Group Policy Editor&#xff09;来管理这些设…

MySQL删除外键报错check that column/key exists

在我们删除外键的时候&#xff0c;报了check that column/key exists这个错误&#xff0c;这是因为你的外键名字没写对&#xff0c;我们以为我们写的字段名就是我们的外键其实并不是&#xff0c;我们可以通过show create table[ ]来查看外键的名字 所以删除外键的时候应该这样…

python学opencv|读取图像(十)用numpy创建彩色图像

【1】引言 前序文章中&#xff0c;我们已经学会了用numpy规划数据控制像素大小&#xff0c;然后用像素规划矩阵&#xff0c;对矩阵赋值后输出灰度图&#xff0c;相关链接为&#xff1a; python学opencv|读取图像&#xff08;八&#xff09;用numpy创建纯黑灰度图-CSDN博客 p…

线程池(ThreadPoolExecutor)

目录 一、线程池 标准提供的线程池 ThreadPoolExecutor 自定义线程池 一、线程池 为什么要引入线程池? 这个原因我们需要追溯到线程&#xff0c;我们线程存在的意义在于&#xff0c;使用进程进行并发编程太重了&#xff0c;所以引入了线程&#xff0c;因为线程又称为 “轻…

hbase读写操作后hdfs内存占用太大的问题

hbase读写操作后hdfs内存占用太大的问题 查看内存信息hbase读写操作 查看内存信息 查看本地磁盘的内存信息 df -h查看hdfs上根目录下各个文件的内存大小 hdfs dfs -du -h /查看hdfs上/hbase目录下各个文件的内存大小 hdfs dfs -du -h /hbase查看hdfs上/hbase/oldWALs目录下…

【IntelliJ IDEA 集成工具】TalkX - AI编程助手

前言 在数字化时代&#xff0c;技术的迅猛发展给软件开发者带来了更多的挑战和机遇。为了提高技术开发群体在繁多项目中的编码效率和质量&#xff0c;他们需要一个强大而专业的工具来辅助开发过程&#xff0c;而正是为了满足这一需求&#xff0c;TalkX 应运而生。 一、概述 1…

vue2+element-ui实现多行行内表格编辑

效果图展示 当在表格中点击编辑按钮时:点击的行变成文本框且数据回显可以点击确定按钮修改数据或者取消修改回退数据: 具体实现步骤 1. 行数据定义编辑标记 行数据定义编辑标记 当在组件中获取到用于表格展示数据的方法中,针对每一行数据添加一个编辑标记 this.list.f…

React 第十六节 useCallback 使用详解注意事项

useCallback 概述 1、useCallback 是在React 中多次渲染缓存函数的 Hook&#xff0c;返回一个函数的 memoized的值&#xff1b; 2、如果多次传入的依赖项不变&#xff0c;那么多次定义的时候&#xff0c;返回的值是相同的,防止频繁触发更新&#xff1b; 3、多应用在 父组件为函…

【智体OS】官方上新发布智体机器人:使用rtrobot智体应用远程控制平衡车机器人

【智体OS】官方上新发布智体机器人&#xff1a;使用rtrobot智体应用远程控制平衡车机器人 dtns.network是一款主要由JavaScript编写的智体世界引擎&#xff08;内嵌了three.js编辑器的定制版-支持以第一视角浏览3D场馆&#xff09;&#xff0c;可以在浏览器和node.js、deno、e…

Windows系统VSCode 搭建ESP-IDF环境

VS Code&#xff0c;安装ESP-IDF插件 快捷键CTRLSHIFTP&#xff0c;弹出显示所有命令的窗口&#xff0c;选择ESP-IDF的欢迎 使用第一个选项&#xff0c;要选择一个ESP-IDF版本&#xff0c;选最新的就行 点击Install,等待下载 提示安装成功&#xff0c;如果过程中出现python已存…

PR裁剪与删除

剪切 剪切片段 工具面板的第四个工具&#xff0c;剃刀工具&#xff0c;在英文输入法下可以使用快捷键C来切换&#xff0c;或者直接使用CtrlK进行裁剪。 CtrlK&#xff1a;选中剪辑后会在指针处进行裁剪。 剃刀工具&#xff1a;在执行位置剪裁&#xff0c;包括连接在一起的素材…

基于物联网的 AI 智能送药车与自维护基站系统研究

一、引言 &#xff08;一&#xff09;研究背景 随着科技的飞速发展&#xff0c;物联网技术在各个领域都展现出了巨大的潜力。在医疗领域&#xff0c;物联网技术的应用为提高医疗服务的效率和质量带来了新的机遇。其中&#xff0c;基于物联网的 AI 智能送药车与自维护基站系统…

TÜLU 3: Pushing Frontiers inOpen Language Model Post-Training

模型&#xff1a;https://huggingface.co/allenai 技术报告&#xff1a;https://allenai.org/papers/tulu-3-report.pdf 数据集&#xff1a;https://huggingface.co/collections/allenai/tulu-3-datasets-673b8df14442393f7213f372 GitHub&#xff1a;https://github.com/al…

123213124

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

软考系分:今日成绩已出

前言 今年报考了11月份的软考高级&#xff1a;系统分析师。 考试时间&#xff1a;11月9日。 总体感觉偏简单&#xff0c;但是知识点记得不牢&#xff0c;估计机会不大。 今日 12.11 &#xff0c;成绩已出&#xff0c;每科总分 75分&#xff0c;全部45分以上为通过。 成绩总…

数据结构10——排序

目录 1.插入排序 1.1 直接插入排序 1.2 希尔排序 2. 选择排序 2.1 直接选择排序 2.2 堆排序 *TopK问题&#xff1a; 3. 交换排序 3.1 冒泡排序 3.2 快速排序 1. Hoare版本 2. 挖坑法 3. 前后指针法 4. 快速排序优化 5. 非递归快速排序 4.归并排序 1.递归式归并…