Qt局部变量“遮蔽(shadow)”成员变量导致lambda传参报错

1、类里有成员变量

cpp 复制代码
class Client {
public:
    QMenu *settingsMenu;
};

2、在函数里又写了同名局部变量(致命点)

cpp 复制代码
void Client::initSettingsMenu()
{
    QMenu *settingsMenu = new QMenu(this); // ❌ 局部变量
}

结果是:

名称 实际指向
局部 settingsMenu 正确的 QMenu
成员 this->settingsMenu ❌ 未初始化

3、函数结束后

  • 局部变量 消失

  • 成员变量 仍是野指针

4、 局部函数lambda 中调用反复报错

cpp 复制代码
QTimer::singleShot(3000, this, [=]() {
    settingsMenu->popup(pos);
});

⚠️ 这里的 settingsMenu 指的是:

👉 this->settingsMenu(成员)

👉 不是当初 new 的那个局部变量,所以各种报错

这个问题调试QMenu按钮有时不释放,视觉残留问题时才发现,最后发现原因是:

由于 QMenu 是 Qt::Popup 窗口,它会捕获鼠标事件,导致原按钮收不到 HoverLeave 或 MouseButtonRelease 事件,于是 Qt 样式引擎"以为"按钮还处于某种中间状态,解决方式如下:

cpp 复制代码
connect(ui->button, &QPushButton::clicked, [this]() {
    settingMenu->exec(ui->button->mapToGlobal(QPoint(0, ui->button->height())));

    // 强制重置按钮视觉状态(解决"需 hover 才刷新"问题)
    ui->button->setAttribute(Qt::WA_UnderMouse, false);
    ui->button->style()->unpolish(ui->button);
    ui->button->style()->polish(ui->button);
    ui->button->update();
});
相关推荐
HDO清风12 小时前
CASIA-HWDB2.x 数据集DGRL文件解析(python)
开发语言·人工智能·pytorch·python·目标检测·计算机视觉·restful
2201_7569890912 小时前
C++中的事件驱动编程
开发语言·c++·算法
多米Domi01112 小时前
0x3f 第48天 面向实习的八股背诵第五天 + 堆一题 背了JUC的题,java.util.Concurrency
开发语言·数据结构·python·算法·leetcode·面试
2301_8223776512 小时前
模板元编程调试方法
开发语言·c++·算法
csbysj202012 小时前
Python 循环嵌套
开发语言
深蓝海拓13 小时前
PySide6从0开始学习的笔记(二十六) 重写Qt窗口对象的事件(QEvent)处理方法
笔记·python·qt·学习·pyqt
测试_AI_一辰13 小时前
Agent & RAG 测试工程05:把 RAG 的检索过程跑清楚:chunk 是什么、怎么来的、怎么被命中的
开发语言·人工智能·功能测试·自动化·ai编程
Coding茶水间13 小时前
基于深度学习的输电电力设备检测系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)
开发语言·人工智能·深度学习·yolo·目标检测·机器学习
清风~徐~来13 小时前
【视频点播系统】BRpc 介绍及使用
开发语言
啟明起鸣13 小时前
【C++ 性能提升技巧】C++ 的引用、值类型、构造函数、移动语义与 noexcept 特性,可扩容的容器
开发语言·c++