
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);
通过上述修改,问题应该得到解决,点击图标后能够正常连接到槽函数