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

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

cpp 复制代码
QAction *action_distanceMeasure;

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

2、槽函数为

cpp 复制代码
//距离测量槽函数
void QtGuiTest::slot_onDistanceMeasureButtonClicked()
{
	_isMearuring = !_isMearuring;
	_distanceMeasureHandler->setActive(_isMearuring);

}

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

cpp 复制代码
//绑定测量按钮事件
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 未手动赋值(默认是 nullptr connect 时连接的是这个空指针,槽函数不响应
局部变量 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 类的自定义成员):

cpp 复制代码
// 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);

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

相关推荐
傻啦嘿哟5 小时前
某招聘平台爬虫:爬取招聘岗位数据,分析各城市薪资水平
开发语言·爬虫·python
2501_933670795 小时前
2026秋招量化分析岗技能栈:Python、SQL、统计建模、回测项目怎么准备
开发语言·python·sql
李少兄6 小时前
JavaScript 数据类型完全指南
开发语言·javascript·ecmascript
Seoyoneh6 小时前
Agentic Workflow编排架构:云客服从“被动响应”迈向“主动执行”的技术实现
java·开发语言·架构
Tangyuewei7 小时前
Java 写 Agent:模型只是组件
java·开发语言
小玮看世界7 小时前
[Python]从合并区间到传感器融合区:合并区间在传感器区域融合的实际落地
开发语言·python
繁星蓝雨8 小时前
C++的设计与演进大纲(如何从C语言一步步成长为C++)
c语言·开发语言·c++·c++历史·c++演进
Evand J8 小时前
【MATLAB例程,图像降噪滤波9】自适应维纳滑动窗口滤波(Wiener)图像降噪、方法对比,有中文注释
开发语言·图像处理·计算机视觉·matlab·滑动窗口·滤波·降噪
杜大哥9 小时前
python程序:如何查看电脑【电池电量的剩余百分比】 和 【是否插入连接着充电器】?
开发语言·python
wuyk5559 小时前
Python网络爬虫入门到实战 第01章:爬虫到底是什么?原理、流程、合法性、风险全解析(零基础必看)
开发语言·爬虫·python