Qt工具栏中图标槽函数没有响应的问题分析

1、在ui_QtGuitTest.h中有定义 QAction *action_distanceMeasure

QAction *action_distanceMeasure;

在QtGuiTest.cpp的InitToolBar()函数中也有定义,如下图所示:

2、槽函数为

//距离测量槽函数
void QtGuiTest::slot_onDistanceMeasureButtonClicked()
{_isMearuring = !_isMearuring;_distanceMeasureHandler->setActive(_isMearuring);}

3、槽函数的连接代码如下代码所示:

//绑定测量按钮事件
connect(ui_Qt.action_distanceMeasure, &QAction::triggered, this, &QtGuiTest::slot_onDistanceMeasureButtonClicked);

如上所示,程序中想要实现距离测量,已经做了上述工作。但程序运行时,点击距离测量图标,槽函数没有反应,单步调试点击图标后,程序没有运行到槽函数。

经研究发现问题出现在第1步。

问题在于类成员变量与局部变量同名导致的 “变量隐藏”

代码中存在两个同名的 action_distanceMeasure,(即ui_QtGuitTest.h中的 QAction *action_distanceMeasure和QtGuiTest.cpp的InitToolBar()函数中的QAction* action_distanceMeasure)但作用域和生命周期完全不同,导致连接和访问时指向了错误的对象:

变量类型声明位置作用域赋值情况最终结果
类成员变量ui_QtGuitTest.h 中声明

整个 

QtGuiTest 类

未手动赋值(默认是 nullptrconnect 时连接的是这个空指针,槽函数不响应
局部变量InitToolBar() 函数内定义仅 InitToolBar() 内正确 new 并初始化(有效)函数执行完后虽未销毁(父对象是 this),但外部无法访问

简单说:
InitToolBar() 中用 QAction* action_distanceMeasure = new ... 创建的是局部变量,它会 “隐藏” 同名的类成员变量 —— 此时类成员变量 action_distanceMeasure 依然是 nullptr。而你后续 connect 时用的是 ui_Qt.action_distanceMeasure(本质是类成员变量),相当于连接了一个空指针,自然无法触发槽函数。

解决方法:

1、删除局部变量的声明,直接初始化类成员变量

在 InitToolBar() 函数中,去掉局部变量的 QAction* 声明,直接对类成员变量进行 new 初始化(避免重复定义),如图红框框选处所示:

注意:

在 InitToolBar() 中访问时,必须通过 ui_Qt. 限定作用域(因为变量属于 Ui::QtGuiTest 结构体,而非 QtGuiTest 类的自定义成员):

// QtGuiTest.cpp 的 InitToolBar() 中
// 直接使用 UI 自动生成的变量,通过 ui_Qt. 访问
ui_Qt.action_distanceMeasure = new QAction(QString::fromLocal8Bit("距离测量"), this);
ui_Qt.action_distanceMeasure->setIcon(QIcon(":/images/Measure/distanceMeasure.png"));
// 后续添加到工具栏
measureToolBar->addAction(ui_Qt.action_distanceMeasure);

通过上述修改,问题应该得到解决,点击图标后能够正常连接到槽函数

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

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

相关文章

Java中 0.05 + 0.01 ≠ 0.06 揭秘浮点数精度陷阱

目录 问题现象根本原因详细分析实际验证解决方案最佳实践总结 一开始看到这个说法的时候我还不相信,还以为之前我学的都错完了,研究之后才明白为什么 问题现象 令人困惑的计算结果 public class FloatPrecisionDemo {public static void main(Strin…

【44页PPT】DeepSeek在银行业务场景的应用(附下载方式)

篇幅所限,本文只提供部分资料内容,完整资料请看下面链接 https://download.csdn.net/download/2501_92808811/91716562 资料解读:【44页PPT】DeepSeek在银行业务场景的应用 详细资料请看本解读文章的最后内容。在智能化时代的浪潮下&#x…

TOPSIS

概述TOPSIS(逼近理想解排序法)是一种多属性决策方法,通过计算各方案与 “理想解”“负理想解” 的距离,排序选最优。操作步骤输入原始决策矩阵(方案 指标);标准化处理(消除量纲&…

Base64 编码优化 Web 图片加载:异步响应式架构(Java 后端 + 前端全流程实现)

异步响应式图片加载与Base64编码实现方案 在Web开发中,图片加载效率直接影响页面性能和用户体验。本文介绍一套基于Java后端和JavaScript前端的实现方案,通过Base64编码传输图片,结合异步加载和响应式布局,实现高效、安全的图片展…

【C语言】分支和循环

目录 前置:关系操作符和逻辑操作符 关系操作符 逻辑操作符 其他补充知识 分支语句: 一、if类 基本式:if... 变式1:if...else... 变式2:if...else if...else... 变式3:嵌套 二、switch 循环语句&…

商超客流密度统计误差率↓35%!陌讯多模态融合算法在零售智慧运营的实战解析

原创声明 本文为原创技术解析文章,核心技术参数与架构设计引用自 “陌讯技术白皮书(2024 版)”,技术描述均经过重写转换,无复制官网文案情况,仅用于计算机视觉技术交流与实战经验分享。 一、零售客流统计的…

游戏空间划分技术

【前言】 空间划分主要是为了降低搜索比较量,如果不采用空间划分,暴力遍历也是可以求解的,但耗时过长。通过空间划分将全局搜索简化为为局部搜索,大大降低搜索量。 搜索出来后最终还要是一一比较,比较的是距离&#…

【C#】观察者模式 + UI 线程调度、委托讲解

“观察者模式 UI 线程调度”的典型应用A. 涉及的知识点(抽象)观察者模式(Observer Pattern) 发布者:DemoDeviceService.cs 内部生成一帧数据 ScopeFrame,通过 OnScopeFrame?.Invoke(frame) 发布事件。订阅…

Linux应用软件编程---网络编程(TCP:[ 其他机制、头部标志位、应用示例 ]、 HTTP:[ 万维网、概念、格式、报文、应用示例 ]

一、TCP 网络协议补充内容1、TCP 的其他机制1)TCP 头部的标志位TCP 头部可用抓包工具 (wireshark) 来查看。头部标志位用途SYN请求建立连接标志位ACK响应报文标志位PSH携带数据标志位,通知接收方该从缓冲区读数据FIN请求断开连接标志位RST复位标志位URG紧…

基于开源飞控pix的无人机装调与测试

文章目录 前言资源下载1、地面站软件独家汉化版QGC地面站(推荐)原版QGC地面站Mission Planner地面站 2、安装好环境的虚拟机安装虚拟机打开虚拟机文件 3、完整的各版本PX4、QGC源码PX4QGC 一、无人机基本常识/预备知识(1)无人机飞…

Ubuntu解决makefile交叉编译的问题

问题1:/usr/lib/gcc-cross/aarch64-linux-gnu/11/../../../../aarch64-linux-gnu/bin/ld: cannot find -lwiringpi: No such file or directory 找不到-lwiringpi库路径,其实在3rd/usr/lib/aarch64-linux-gnu下没有libwiringPi.so.2 …

ExcelUtils实现 设置内容 插入行 复制行列格式

ExcelUtils实现:1.实现输入 例如 2 A 的excel格式,自动填充对应excel单元格;2.实现复制并新增下一行;3.实现控制复制上一行相同列的格式;4.实现控制复制同一行上一列的格式;/*** 在指定行下方插入新行并复…

SQLBot 智能问数、数据洞察逻辑拆解

* 基于 SQLBot v1.0.2* 使用 AI Gateway 抓取模型调用记录SQLBot 通过融入 LLM 能力实现了非常优秀的问数体验,这里记录一下产品中如何引入 AI 能力,顺便探究一下调用大模型的数据安全的问题(是否会向模型提供真实数据)。结论&…

实现统一门户登录跳转免登录

统一门户所有应用页面&#xff0c;点击跳转对应业务系统&#xff0c;实现业务系统免登录//获取所有业务系统项&#xff08;获取并存储到仓库) //用于页面展示 let appSubjectVoList ref<any>([]) appSubjectVoList.value userStore.getAppSubjectVoList || [] //登陆后…

卓伊凡的开源战略与PHP-SG16加密技术深度解析-sg加密技术详解-卓伊凡

卓伊凡的开源战略与PHP-SG16加密技术深度解析-sg加密技术详解-卓伊凡引言&#xff1a;在理想与现实间寻求平衡的开源之路近日&#xff0c;技术创业者卓伊凡先生宣布了一项重大决策&#xff1a;将于明日将其公司旗下的优雅草商城、项目管理系统等众多成熟商业产品正式开源。这一…

回溯 算法常见面试问题

1. 全排列(无重复元素) 核心思想:交换法避免额外空间 def permute(nums):def backtrack(first=0):if first == len(nums):res.append(nums.copy())returnfor i in range(first, len(nums)):nums[first], nums[i] = nums[i], nums[first]backtrack(first + 1)nums[first], …

营销专业人员核心能力构建与发展路径

CDA数据分析师证书含金量高&#xff0c;适应了未来数字化经济和AI发展趋势&#xff0c;难度不高&#xff0c;行业认可度高&#xff0c;对于找工作很有帮助。一、营销人员五维能力模型能力维度核心技能要素工具与方法论产出成果数据驱动决策指标监控、归因分析、效果优化Google …

Android系统学习2——Android.Utils.Log模块讨论

Android系统学习2——Android.Utils.Log模块讨论 ​ 打日志是一个很好的习惯&#xff0c;有的时候我们可以通过这里排查我们的程序的问题。在这里&#xff0c;我们可以从Android的日志机制入手讨论我们的Log模块。 android.util.Log 类的作用 Android 中最常用的日志工具是 and…

使用 YAML 文件,如何优雅地删除 k8s 资源?

在 Kubernetes 中&#xff0c;删除资源是日常运维中不可避免的操作。如果你习惯了使用 kubectl create 和 kubectl apply 来创建和更新资源&#xff0c;那么你可能也会想知道如何用同样基于文件的方式来删除它们。 虽然你总是可以用 kubectl delete deployment <name> 这…

如何将游戏和软件移动到另一个驱动器或外部磁盘中

您的C盘存储空间是否不足&#xff0c;或者您不小心在错误的驱动器中安装了游戏或应用程序。那么使用这个简单的技巧&#xff0c;您可以轻松的将游戏或应用程序移动到另一个分区或磁盘中。1、找到准备移动的软件&#xff0c;选择路径并复制&#xff1a;2、打开记事本&#xff0c…