Qt信号和槽

ops/2025/3/4 22:53:57/

一、介绍

1、介绍信号和槽

在之前的按钮使用中我们初步认识了信号和槽。简单来说就是:

信号源:哪个控件发出的信号。

信号类型:用户对控件的不同操作发出不同的信号。

信号处理方式:槽(对应的回调函数)

2、介绍关联函数 connect

connect 函数:Q_OBJECT 宏自带的静态函数,用于关联信号和槽。

下图是 connect 定义:

const QObject* sender :信号源

const char* signal :信号源发出的信号类型

QObjecct* recever :处理信号者

const char* method :处理信号方式

下图是一个简单的 connect 函数使用:

但是我们提到槽其实是一个函数,上面的 connect 函数参数是 const char* ,这是怎么回事呢?

其实在早期传入信号和槽是需要调用宏来实现的,宏的作用就是把函数指针转成字符串,新版的 connect 函数重载了一个新的:

定义了模板传入的就是任意类型的函数指针。

二、自定义槽函数

上面简单使用 connect 是用的控件默认的信号和槽,下面介绍如何自定义槽函数。

槽函数就是处理信号的回调函数,有两种定义方式。

1、定义成成员函数

widget.h:

widget.cpp:

结果:

2、ui 界面点击定义

上面是堆定义按钮实现按钮按下的槽函数,这里实现拖拽按钮定义槽函数。

ui 界面:

右击控件,选择转到槽:

双击信号 clicked(bool),自动转到定义函数文件 widget.cpp:

结果:

三、自定义信号

1、介绍信号

信号也是一类特殊的函数。

程序员只写出信号的声明并告诉 Qt 这是一个信号函数。函数的定义由 Qt 自动生成,程序员无法干预。

信号函数返回值一定是 void,参数随意,可以重载。

2、自定义信号

widget.h:

signals:就代表我要定义信号函数了。

对应还要实现槽函数 handlerMySignal()

widget.cpp:

实现完槽函数之后,关联槽和信号,

不同于内置信号,用户对控件做出特定行为自动发射信号,自定义信号用 emit 信号 的方式指定位置发射信号调用槽函数。

结果:

四、带参数的信号和槽

信号的参数会作为实参传到槽函数的参数进行逻辑处理。

所以信号和槽对应参数类型一定要一致,但是信号的参数大于等于槽函数的参数,这么做的目的是多个信号对应一个槽函数。

槽函数按顺序拿前 n 个参数。

widget.h:

widget.cpp:

结果:

五、断开连接 disconnect

使用方法和 connect 基本一样,当一个信号要换一个槽函数的时候就需要先断开连接再连接。

widget.h:

widget.cpp:

逻辑就是一个按钮可以改变窗口名字,一个按钮可以改变那个按钮原本的窗口名字。

结果:

先点击修改窗口标题

再点击切换按钮功能后点击修改窗口标题:

六、槽函数 lambda 表达式

和 C++11 的方法一样,不赘述。


http://www.ppmy.cn/ops/163155.html

相关文章

Qt QMenu 使用详解

QMenu 简介 QMenu 是 Qt 中用于创建菜单的组件,通常作为下拉菜单出现在菜单栏(QMenuBar)或上下文菜单(右键菜单)中。它可以包含子菜单、动作项(QAction)、分隔符等。 基础用法 1. 创建菜单栏&…

AI预测福彩3D新模型百十个定位预测+胆码预测+杀和尾+杀和值2025年3月3日第11弹

前面由于工作原因停更了很长时间,停更期间很多彩友一直私信我何时恢复发布每日预测,目前手头上的项目已经基本收尾,接下来恢复发布。当然,也有很多朋友一直咨询3D超级助手开发的进度,在这里统一回复下。 由于本人既精…

《JavaScript解题秘籍:力扣队列与栈的高效解题策略》

232.用栈实现队列 力扣题目链接(opens new window) 使用栈实现队列的下列操作: push(x) -- 将一个元素放入队列的尾部。 pop() -- 从队列首部移除元素。 peek() -- 返回队列首部的元素。 empty() -- 返回队列是否为空。 示例: MyQueue queue new MyQueue(); queue…

深入解析 Vue Router 的 beforeEach:功能、用法与实践指南

什么是 beforeEach?基本语法与参数解析next() 的 4 种调用方式常见使用场景与代码示例动态路由加载的实践技巧常见陷阱与避坑指南总结 1. 什么是 beforeEach? beforeEach 是 Vue Router 提供的 全局前置守卫(Global Before Guards&#xff0…

【AI】DeepSeek本地部署,Ollama + vscode + Continue,实现本地运行LLM大模型,以及代码自动补全

文章目录 相关链接Ollama安装ollama配置ollama models下载地址下载Model Continue接入VsCode安装continue插件添加模型打开配置文件配置项 预告:RAG,知识库 相关链接 Ollama Ollama Models Ollama相关api VsCode下载 Ollama 安装ollama Ollama 是一个开…

CIDR转IP段:原理Java实现

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

2025最新智能优化算法:人工旅鼠算法(Artificial Lemming Algorithm, ALA)求解23个经典函数测试集,MATLAB

一、人工旅鼠优化算法 人工旅鼠算法(Artificial Lemming Algorithm, ALA)是2025年提出的一种新型生物启发式优化算法,受旅鼠的四种典型行为启发:长距离迁徙、挖洞、觅食和躲避捕食者。该算法通过模拟这些行为来解决复杂的优化问题…

【Qt QML】布局管理

一、QML布局管理概述 QML(Qt Meta-Object Language)提供了多种灵活的布局方案,适用于从移动端到桌面端的跨平台界面开发。与传统Widgets的布局策略不同,QML强调声明式编程与响应式设计的深度融合。布局管理是用于在 QML 界面中对元素进行合理排列和定位的机制。 二、布局…