2

大家好,

    我有一些代码根据某些数据生成动态填充的 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 的正确方法是什么?

    谢谢,

4

2 回答 2

3

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

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

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

请问你为什么要重用你的QMenu?

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

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

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

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

于 2014-09-23T06:40:06.030 回答
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);
    }
}
于 2014-09-23T17:13:49.140 回答