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 样式引擎"以为"按钮还处于某种中间状态,解决方式如下:
cppconnect(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(); });