当前位置: 首页 > news >正文

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.dtcms.com/a/348901.html

相关文章:

  • 【JVM内存结构系列】三、堆内存深度解析:Java对象的“生存主场”
  • 【数据分享】地级市能源利用效率(超效率SBM、超效率CCR)(2006-2023)
  • Vue中 this.$emit() 方法详解, 帮助子组件向父组件传递事件
  • 纯血鸿蒙下的webdav库
  • vue中 computed vs methods
  • 【C++闯关笔记】STL:string的学习和使用(万字精讲)
  • 开发软件安装记录
  • Kubernetes v1.34 前瞻:资源管理、安全与可观测性的全面进化
  • golang6 条件循环
  • R语言rbind()和cbind()使用
  • 信贷策略域——信贷产品策略设计
  • 【数据结构】排序算法全解析
  • 【链表 - LeetCode】206. 反转链表【带ACM调试】
  • HTTP URL 详解:互联网资源的精准地址
  • 当AI遇上终端:Gemini CLI的技术魔法与架构奥秘
  • 在 vue3 和 vue2 中,computed 计算属性和 methods 方法区别是什么
  • 打响“A+H”双重上市突围战,云天励飞实力如何?
  • JUC并发编程07 - wait-ify/park-un/安全分析
  • 《CF1120D Power Tree》
  • Spirng Cloud Alibaba主流组件
  • 【ElasticSearch】springboot整合es案例
  • 企业出海第一步:国际化和本地化
  • springBoot如何加载类(以atomikos框架中的事务类为例)
  • JavaScript数据结构详解
  • Docker知识点
  • 【数据分享】中国地势三级阶梯矢量数据
  • 【无标题】对六边形拓扑结构中的顶点关系、着色约束及量子隧穿机制进行严谨论述。
  • 深度剖析Spring AI源码(七):化繁为简,Spring Boot自动配置的实现之秘
  • MySQL--基础知识
  • 基础篇(下):神经网络与反向传播(程序员视角)