首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt &将一个QMenu前缀为另一个QMenu

Qt &将一个QMenu前缀为另一个QMenu
EN

Stack Overflow用户
提问于 2016-02-25 02:56:14
回答 3查看 1.5K关注 0票数 1

使用Qt5,比如说我有一个控件实现了它自己的上下文菜单。假设在某些条件下,我希望中的一些项添加到标准上下文菜单中。因此,为了做到这一点,我创建了一个临时QMenu,向它添加了一些内容,并附加了标准菜单。类似于:

代码语言:javascript
复制
// 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添加到菜单的顶级中,并确保没有泄漏。

EN

回答 3

Stack Overflow用户

发布于 2016-02-25 14:47:55

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

因此,原菜单所拥有的操作应该重新命名:

代码语言:javascript
复制
for (auto a : contextMenu->actions)
    {
        tempMenu->addAction(a);
        if (a->parent() == contextMenu){
            a->setParent(tempMenu);
        }
    }
delete contextMenu;
contextMenu = tempMenu;
票数 1
EN

Stack Overflow用户

发布于 2016-02-25 14:49:15

使用insertActionQMenu上插入第一个标准操作之前的自定义操作,如下所示:

代码语言:javascript
复制
QMenu* contextMenu = createStandardContextMenu();
QAction* first = contextMenu->actions().at(0);
QAction* customAction = /* Create some custom action */
contextMenu->insertAction(first, customAction);

编辑:然后您可以使用insertSeparator将您的自定义操作与第一个标准操作分开。

票数 1
EN

Stack Overflow用户

发布于 2016-02-25 07:31:29

上下文菜单应该是模态对话框,所以不要使用动态分配,将“此”传递给结构器,并根据传递的上下文构建菜单。

代码语言:javascript
复制
(condition)
{
     context.add(...);
}

CustomMenu menu(this,context);
menu.exec(mapToGlobal(point));

没有代表要添加评论,所以

代码语言:javascript
复制
 QMenu* tempMenu = new QMenu(this); 

不,这不会泄漏,因为您传递父对象的指针。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35617377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档