【Qt】信号和槽


 需要云服务器等云产品来学习Linux的同学可以移步/-->腾讯云<--/-->阿里云<--/-->华为云<--/官网,轻量型云服务器低至112元/年,新用户首次下单享超低折扣。


 目录

一、Qt中的信号和槽

1、信号

2、槽

3、Q_OBJECT

二、Qt中的connect函数

三、自定义信号、自定义槽

1、自定义槽函数

1.1使用代码创建控件的方式

1.2使用ui创建控件的方式

2、自定义信号

四、带参数的信号和槽

五、信号和槽断开连接

六、使用lambda表达式定义槽函数


一、Qt中的信号和槽

1、信号

信号源:由哪个控件产生的信号

信号的类型:用户对GUI界面的不同操作,就可能触发不同的信号(点击、移动光标、勾选、下拉等)

2、槽

信号的处理方式:槽 =>处理信号的回调函数

Qt使用connect这样的函数,把一个信号和一个槽关联起来。信号触发,自动回调信号处理函数。

3、Q_OBJECT

如果一个类要使用信号和槽,必须在类中添加Q_OBJECT这个宏

二、Qt中的connect函数

connect是QObject(Qt中其他类的“祖先类”)提供的静态成员函数。

bool QObject::connect(const QObject *sender,const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type=Qt::AutoConnection);
  • const QObject *sender: 哪个控件?
  • const QMetaMethod &signal: 哪种信号?(必须是信号源自带或继承自父类的信号)
  • const QObject *receiver: 哪个对象负责处理?
  • const QMetaMethod &method: 用于处理信号的槽函数。(要处理信号的对象提供的成员函数)
  • Qt::ConnectionType type: 连接类型,它可以指定连接的类型,如自动连接、直接连接等。通常不需要手动设定。
  • 第一个和第二个参数,第三个和第四个参数类型要对上才行。

[signal] void QAbstractButton::clicked(boolchecked = false)

This signal is emitted when the button is activated (i.e., pressed down then released while the mouse cursor is inside the button), when the shortcut key is typed, or when click() or animateClick() is called. Notably, this signal is not emitted if you call setDown(), setChecked() or toggle().

If the button is checkable, checked is true if the button is checked, or false if the button is unchecked.

See also pressed(), released(), and toggled().

三、自定义信号、自定义槽

1、自定义槽函数

槽函数一般用于用户触发某个操作后,需要执行的业务逻辑。所以需要自定义槽函数。

1.1使用代码创建控件的方式

1.2使用ui创建控件的方式

自动生成的槽函数的名字是on_pushButton_clicked,其中on是固定的,pushButton是ui中的objectName,clicked写明了是哪种信号。所以ui自动生成的槽函数不需要connect函数就能在触发信号时被回调。(ui_widget.h中调用了QMetaObject::connectSlotsByName,它会触发自动连接信号槽的规则)

2、自定义信号

自定义信号很少用到。因为在GUI中,用户的操作行为是可以穷举的,Qt内置的信号已经覆盖到了大部分可能的用户操作。

如果真的需要自定义信号:

1、信号是一种特殊的函数,程序员只需写出函数声明,并告诉Qt,这是一个信号即可。这个函数的定义,是Qt在编译过程中,自动生成的。(无法干预)

2、信号函数的返回值必须是void,有没有参数都可以,也支持函数重载。

3、信号可以使用emit关键字进行发射。(Qt5 emit不写也行)

四、带参数的信号和槽

信号和槽也可以带参数。发射信号时,就可以给信号函数传递实参,这个参数就会被传递到对应的槽函数中。

信号和槽函数的参数类型必须一致,个数可以不一致,但是信号的参数个数必须大于槽函数的参数个数。

一个信号通过connect关联多个槽函数,一个槽函数也能被多个信号关联。

五、信号和槽断开连接

使用disconnect断开信号槽的连接(主动断开往往是把信号重新绑定到另一个槽函数上)

如果这里的代码没有disconnect,会使一个信号绑定两个槽函数,触发点击按钮,同时执行两个槽函数。

六、使用lambda表达式定义槽函数

注意被捕获变量的生命周期。

尽量传值捕获,传引用捕获可能会捕获到已经被释放的变量,造成段错误。例如:

上图传值捕获没问题,传引用捕获会崩溃。原因是button是局部变量(它指向的空间位于堆区,但它自己是一个局部变量的指针),构造函数结束后button变量即被销毁,造成段错误。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零开始学习Python控制开源Selenium库自动化浏览器操作,实现爬虫,自动化测试等功能(一)

介绍Selenium &#xff1a; Selenium是一个用于自动化浏览器操作的开源工具和库。它最初是为Web应用测试而创建的&#xff0c;但随着时间的推移&#xff0c;它被广泛用于Web数据抓取和网页自动化操作。Selenium 支持多种编程语言&#xff0c;包括Python&#xff0c;Java&#x…

vectorCast添加边界值分析测试用例

1.1创建项目成功后会自动生成封装好的函数,在这些封装好的函数上点击右键,添加边界值分析测试用例,如下图所示。 1.2生成的用例模版是不可以直接运行的,需要我们分别点击它们,让它们自动生成相应测试用例。如下图所示,分别为变化前和变化后。 1.3点击选中生成的测试用例,…

实现SERVLET应用程序

实现SERVLET应用程序 Smart Software 的开发人员希望开发一个Web应用程序,使用servlet显示保存在表中的雇员信息。该应用程序需要有用户界面,用户可在该用户界面中指定要查看雇员数据的雇员ID。该界面还应显示网站被访问的次数。 解决方案 要解决上述问题,需要执行以下任务…

Java中的包、类、接口说明

写在开头 包、类、接口、方法、变量、参数、代码块,这些都是构成Java程序的核心部分,即便最简单的一段代码里都至少要包含里面的三四个内容,这两天花点时间梳理了一下,理解又深刻了几分。 Java中的包 Java 定义了一种名字空间,称之为包:package。一个类总是属于某个包…

在 EggJS 中实现 Redis 上锁

配置环境 下载 Redis Windows 访问 https://github.com/microsoftarchive/redis/releases 选择版本进行下载 - 勾选 [配置到环境变量] - 无脑下一步并安装 命令行执行&#xff1a;redis-cli -v 查看已安装的 Redis 版本&#xff0c;能成功查看就表示安装成功啦~ Mac brew i…

Flink SQL

Flink SQL 来源&#xff1a;B站尚硅谷 sql-client准备 Table API和SQL是最上层的API&#xff0c;在Flink中这两种API被集成在一起&#xff0c;SQL执行的对象也是Flink中的表&#xff08;Table&#xff09;&#xff0c;所以我们一般会认为它们是一体的。Flink是批流统一的处理…

【JavaEE】文件操作与IO

作者主页&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文于《JavaEE》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精力)打造&…

【Oracle】收集Oracle数据库内存相关的信息

文章目录 【Oracle】收集Oracle数据库内存相关的信息收集Oracle数据库内存命令例各命令的解释输出结果例参考 【声明】文章仅供学习交流&#xff0c;观点代表个人&#xff0c;与任何公司无关。 编辑|SQL和数据库技术(ID:SQLplusDB) 【Oracle】收集Oracle数据库内存相关的信息 …

详细版Git的下载安装与配置(Windows)

一、git的下载 Git是一个非常好用的版本控制工具。下载地址如下&#xff1a;Git - Downloads。建议使用国内浏览器下载&#xff0c;因为不用翻墙&#xff0c;速度快。 当你用浏览器去访问上面的地址后&#xff0c;下载页面会自动识别你的电脑系统&#xff0c;如下 点击&#…

鸿蒙开发环境配置-Windows

背景 入局鸿蒙开发&#xff0c;发现在 Windows 下面配置安装相关环境并没有像 Mac 一样简单&#xff0c;过程中遇到了一些问题记录一下。 Devceo Studio 下载安装 目前鸿蒙的 IDE 最新版是 4.0&#xff0c;通过这个连接可以下载&#xff0c;鸿蒙4.0下载连接。选择符合我们电…

73.网游逆向分析与插件开发-背包的获取-物品数据的初步数据分析

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;72.网游逆向分析与插件开发-背包的获取-项目需求与需求拆解-CSDN博客 然后首先找切入点&#xff1a; 通过药物来当切入点&#xff0c;药物比较好使用&#xff0c;然后鼠标放到药物上它有名字、种类、…

Ubuntu20.4 Mono C# gtk 编程习练笔记(三)

Mono对gtk做了很努力的封装&#xff0c;即便如此仍然与System.Windows.Form中的控件操作方法有许多差异&#xff0c;这是gtk本身特性或称为特色决定的。下面是gtk常用控件在Mono C#中的一些用法。 Button控件 在工具箱中该控件的clicked信号双击后自动生成回调函数prototype&…