在多个Q菜单中重复使用一个Q菜单

Reusing a QMenu within multiple Qmenu

本文关键字:菜单 一个      更新时间:2023-10-16

大家好,

 nbsp nbsp;我有一些代码根据一些数据生成一个动态填充的QMenu(我将称之为thisMenu)。创建了QMenu thisMenu,将一些"主"QWidget作为父菜单,并将其添加到该QWidget内的QMenuBar(menuBar.addMenu(&thisMenu))。稍后,我希望用户能够从上下文菜单访问thisMenu(用户右键单击QWidget的某个部分,弹出一个带有一些操作的QMenu(称为上下文菜单),并将上一个QMenu作为子菜单)。

 nbsp nbsp;如果我重复使用我第一次使用contextMenu.addMenu(&thisMenu)创建的QMenu,我会发现,即使contextMenu弹出在正确的全局位置,thisMenu也总是被翻译到其他位置,有时出现在contextMenu的上方,有时在其下。

 nbsp nbsp;我可以测试这是否链接到了育儿链:thisMenu不是contextMenu的子菜单,如果我将其创建为contextMenu的一个子菜单,一切都很好。是否有一种方法可以在不重新创建类似于thisMenu的QMenu或更改thisMenu的父菜单的情况下干净地处理这种情况;即在QMenuBar和某些上下文菜单/QMenu中重复使用此菜单?换句话说,处理QMenu的育儿链和共享QMenu是什么正确的方式?

 nbsp nbsp;谢谢你,

换句话说,处理QMenu的育儿链和共享QMenu是什么正确的方式?

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

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

请问您为什么要重用QMenu?

我可以测试一下这是否与育儿链有关:thisMenu不是contextMenu 的子项

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

如果我将其创建为contextMenu的子项,那么一切都很好。

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

根据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);
    }
}