gpt4 book ai didi

c++ - Qt & Prepending 一个 QMenu 到另一个 QMenu

转载 作者:行者123 更新时间:2023-11-28 05:49:09 24 4
gpt4 key购买 nike

使用 Qt5,假设我有一个实现其自己的上下文菜单的控件。并假设在某些情况下我想将一些项目添加到标准上下文菜单。因此,为此,我创建了一个临时 QMenu,向其中添加一些内容并附加标准菜单。像这样的东西:

// MyControl is derived from QPlainTextEdit
void MyControl::showContextMenu(const QPoint& pos)
{
// This is QPlainTextEdit::createStandardContextMenu()
QMenu* contextMenu = createStandardContextMenu();

if (someCondition)
{
QMenu* tempMenu = new QMenu(this);
/* add several actions to tempMenu */

tempMenu->addSeperator();

for (auto a : contextMenu->actions)
{
tempMenu->addAction(a);
}

// Feel like I should delete the original QMenu here but doing this
// will delete the QActions it created
// delete contextMenu;
contextMenu = tempMenu;
}

contextMenu->exec(mapToGlobal(pos));
delete contextMenu;
}

我的问题是,这不是引入了内存泄漏吗?如果是这样,解决这个问题的正确方法是什么?我不能在执行 contextMenu = newMenu; 之前 delete contextMenu 因为这显然会删除我想要的操作。

编辑:

最终我想做的是使用 createStandardContextMenu() 返回分配的 QMenu,然后将一些 QActions 添加到菜单的 top,并确保没有泄漏。

最佳答案

QWidget::addAction(QAction*) 不获取操作的所有权。删除 contextMenu 是否会导致删除操作取决于 createStandardContextMenu 是如何实现的(例如 QMenu::addAction(QString) 确实取得了它创建的 Action )。

因此应重新设置原始菜单所拥有的操作:

for (auto a : contextMenu->actions)
{
tempMenu->addAction(a);
if (a->parent() == contextMenu){
a->setParent(tempMenu);
}
}
delete contextMenu;
contextMenu = tempMenu;

关于c++ - Qt & Prepending 一个 QMenu 到另一个 QMenu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35617377/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com