【问题标题】:Reusing a QMenu within multiple Qmenu在多个 Qmenu 中重用 QMenu
【发布时间】:2014-11-17 02:57:49
【问题描述】:

大家好,

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

    谢谢,

【问题讨论】:

    标签: c++ qt parent qobject qmenu


    【解决方案1】:

    另外,处理 QMenu 的父链和共享 QMenu 的正确方法是什么?

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

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

    请问您为什么要重用 QMenu?

    我可以测试这是否链接到父链:thisMenu 不是 contextMenu 的子项

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

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

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

    【讨论】:

      【解决方案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);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多