在多个Qmenu中重用QMenu

时间:2014-09-23 02:38:04

标签: c++ qt parent qobject qmenu

大家好,

我有一些代码生成动态填充的QMenu,具体取决于某些数据(我将其称为thisMenu)。创建了QMenu thisMenu,将一些“主”QWidget作为父级,并添加到此QWidget中的QMenuBar(menuBar.addMenu(& thisMenu))。后来,我希望用户能够从上下文菜单访问thisMenu (用户右键单击QWidget的某些部分,弹出QMenu(称为contextMenu),其中包含一些操作,以及之前的QMenu作为子菜单)。

如果我重复使用我最初使用contextMenu.addMenu(& thisMenu)创建的QMenu,我发现即使contextMenu弹出正确的全局位置,thisMenu总是会转换到其他位置并且有时会出现在上面,有时候在contextMenu。

我可以测试它是否与父母链相关联:thisMenu不是contextMenu的子节点,如果我创建它是contextMenu的子节点,一切都很好。有没有办法干净地处理这种情况,而无需重新创建类似于thisMenu的QMenu,或更改thisMenu的父级;即在QMenuBar和某些上下文菜单/ QMenu中重用thisMenu?在其他什么是处理QMenu的父母链和分享QMenu的正确方法?

谢谢,

2 个答案:

答案 0 :(得分:3)

  

在其他方面,处理QMenu和共享QMenu的育儿链的正确方法是什么?

您不能跨多个地方共享QMenu - 每个QMenu一次只能存在于一个地方。您应该创建单独的QMenus:一个用于菜单栏,另一个用于上下文菜单。

一种简单的方法是将菜单生成代码放在for循环中,以创建多个相同的菜单。

请问您为什么要重复使用QMenu?

  

我可以测试它是否与父母链相关联:thisMenu不是contextMenu的孩子

是的,文档中对此进行了描述。当您将一个QMenu添加到另一个QMenu时,父级不会更改:http://qt-project.org/doc/qt-5/QMenu.html#addMenu

  

如果我创建了contextMenu的孩子,一切都很好。

小部件的位置始终绘制在相对于其父级的位置。 (记住:QMenu是QWidget)

答案 1 :(得分:2)

JKSH的回答之后,我决定使用一个函数复制QMenu,而不复制其中的QAction(它们不继承QWidget),因此保留了所有已建立的连接:

void duplicateMenu(QMenu* dst, QMenu& origin)
{
    QMenu* sub = dst->addMenu(origin.title());
    QList<QAction*> actions=origin.actions();

    for(QList<QAction*>::iterator it=actions.begin(); it!=actions.end(); it++)
    {
        QMenu* itMenu = (*it)->menu();

        if(itMenu!=NULL)
            duplicateMenu(sub, *itMenu);
        else
            sub->addAction(*it);
    }
}