使用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;
}我的问题是,这不是导致了内存泄漏吗?如果是这样的话,正确的方法是什么呢?我不能在做delete contextMenu之前做contextMenu = newMenu;,因为这显然会删除我想要的操作。
编辑:
最后,我想要做的是使用createStandardContextMenu(),它返回一个分配的QMenu,然后将一些QActions添加到菜单的顶级中,并确保没有泄漏。
发布于 2016-02-25 14:47:55
QWidget::addAction(QAction*)不拥有该操作的所有权。删除contextMenu是否会导致操作的删除取决于如何实现createStandardContextMenu (例如,QMenu::addAction(QString)确实拥有它创建的操作的所有权)。
因此,原菜单所拥有的操作应该重新命名:
for (auto a : contextMenu->actions)
{
tempMenu->addAction(a);
if (a->parent() == contextMenu){
a->setParent(tempMenu);
}
}
delete contextMenu;
contextMenu = tempMenu;发布于 2016-02-25 14:49:15
使用insertAction在QMenu上插入第一个标准操作之前的自定义操作,如下所示:
QMenu* contextMenu = createStandardContextMenu();
QAction* first = contextMenu->actions().at(0);
QAction* customAction = /* Create some custom action */
contextMenu->insertAction(first, customAction);编辑:然后您可以使用insertSeparator将您的自定义操作与第一个标准操作分开。
发布于 2016-02-25 07:31:29
上下文菜单应该是模态对话框,所以不要使用动态分配,将“此”传递给结构器,并根据传递的上下文构建菜单。
(condition)
{
context.add(...);
}
CustomMenu menu(this,context);
menu.exec(mapToGlobal(point));没有代表要添加评论,所以
QMenu* tempMenu = new QMenu(this); 不,这不会泄漏,因为您传递父对象的指针。
https://stackoverflow.com/questions/35617377
复制相似问题