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();
});
相关推荐
blasit6 小时前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
郑州光合科技余经理5 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1235 天前
matlab画图工具
开发语言·matlab
dustcell.5 天前
haproxy七层代理
java·开发语言·前端
norlan_jame5 天前
C-PHY与D-PHY差异
c语言·开发语言
多恩Stone5 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
QQ4022054965 天前
Python+django+vue3预制菜半成品配菜平台
开发语言·python·django
遥遥江上月5 天前
Node.js + Stagehand + Python 部署
开发语言·python·node.js
m0_531237175 天前
C语言-数组练习进阶
c语言·开发语言·算法
Railshiqian5 天前
给android源码下的模拟器添加两个后排屏的修改
android·开发语言·javascript