gpt4 book ai didi

c++ - 何时以及如何正确销毁 QMenu 上下文菜单?

转载 作者:搜寻专家 更新时间:2023-10-31 00:10:13 27 4
gpt4 key购买 nike

我允许自定义上下文菜单出现在表格上。这是菜单的生成方式,使用接受目标小部件和坐标的通用函数:

#include <QMenu>
void MainWindow::makeContextMenu(const QPoint& pos, QWidget* target)
{
QMenu *menu = new QMenu(this);
menu->addAction(new QAction("Action 1", menu));
menu->addAction(new QAction("Action 2", menu));
menu->addAction(new QAction("Action 3", menu));
// Notify window about clicking
QObject::connect(menu, &QMenu::triggered, this, &MainWindow::menuClicked);
// If this is a scroll area, map coordinates to real app coordinates
if(QAbstractScrollArea* area = dynamic_cast<QAbstractScrollArea*>(target))
menu->popup(area->viewport()->mapToGlobal(pos));
else
menu->popup(pos);
}

问题是 QMenu* menu 永远不会被破坏并从内存中删除。即使在隐藏之后,它仍然作为 MainWindow 的子级存在。

我该怎么办?我可以将菜单设置为自行删除吗?或者我应该重用相同的菜单实例还是将其保存到相同的指针中?

最佳答案

没必要这么复杂。已经这样了:

menu->setAttribute(Qt::WA_DeleteOnClose);

这样,当 QMenu 关闭时,一旦再次进入事件循环,类就会被删除。触发操作或刚刚关闭弹出窗口都没有关系。

为了证明我的答案,您可以通过检查菜单何时创建以及是否使用相同地址触发“已删除”消息来自行测试:

qDebug() << "created" << (qintptr)menu;
connect(menu, &QMenu::destroyed,
this, [menu]() { qDebug() << "deleted" << (qintptr)menu; });

关于c++ - 何时以及如何正确销毁 QMenu 上下文菜单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39259862/

27 4 0