如何将QMenu转换为QMenuBar?

时间:2018-09-20 14:24:13

标签: c++ qt qt5

我有QMenu,其中包含子菜单:

QMenu menu;
// Add some submenus
menu.addMenu(new QMenu("1", menu));
menu.addMenu(new QMenu("2", menu));
menu.addMenu(new QMenu("3", menu));

我想将这些子菜单从QMenu移到QMenuBar

QMenuBar* menubar = convertFromQMenu(&menu);

这是我认为convertFromQMenu的实现可能是这样的:

QMenuBar* convertFromQMenu(QMenu* menu) {
    QMenuBar *menubar = new QMenuBar();
    /*
    for(QMenu* menu: menu->menus()) {
        menu.setParent(menubar);
        menubar.addMenu(menu);
    }
    */

    return menubar;
}

但是,注释的代码无法编译。

该如何解决?

2 个答案:

答案 0 :(得分:0)

您不需要这种“转换”。如果您从Qt官方doc中仔细阅读了有关QMenuBar和addMenu()成员的信息,则可以轻松地将QMenu添加到QMenuBar中:

QMenu menu;
// Add some menus
menu.add (new QMenu("1", menu));
menu.add (new QMenu("2", menu));
menu.add (new QMenu("3", menu));

QMenuBar menubar;
menubar.addMenu(&menu);

如果要使用QMainWindow菜单栏,则文档会说明:

  

在大多数主窗口样式应用程序中,您将使用QMainWindow中提供的menuBar()函数,将QMenus添加到菜单栏,并将QActions添加到弹出菜单。

     

示例(来自“菜单”示例):

     

fileMenu = menuBar()->addMenu(tr("&File"));

     

fileMenu->addAction(newAct);

答案 1 :(得分:0)

原因

  

for(QMenu* menu: menu->menus()) {

QMenu没有menus方法。

解决方案

到达您想要的位置的路径稍长一些:

  1. 使用QWidget::actions获取添加到菜单的操作列表
  2. 使用QAction::menu获取与每个操作相关的QMenu

现在您可以将菜单添加到QMenuBar

注意:请勿更改菜单和子菜单的父项。

示例

根据您的代码,我建议您像这样实现convertFromQMenu

QMenuBar *MainWindow::convertFromQMenu(QMenu *menu)
{
    auto *menubar = new QMenuBar(this);

    foreach (QAction *act, menu->actions())
        if (act->menu())
            menubar->addMenu(act->menu());

    menu->deleteLater();

    return menubar;
}

以下是测试建议的实现的方法:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    auto *menu = new QMenu("Menu", this);

    // Add some menus
    menu->addMenu(new QMenu("Menu 1", this));
    menu->addMenu(new QMenu("Menu 2", this));
    menu->addSeparator();

    auto *submenu = new QMenu("Menu 3", this);

    submenu->addActions(QList<QAction *>({new QAction("Action 1", this),
                                          new QAction("Action 2", this),
                                          new QAction("Action 3", this)}));

    menu->addMenu(submenu);

    setMenuBar(convertFromQMenu(menu));
    setCentralWidget(new QWidget(this));
    resize(300, 200);
}

我可以随意扩展此示例,以在菜单栏中的菜单 compact extended 形式之间切换(此处未显示)。完整的代码位于GitHub上。

结果

如所写,给定的示例将产生以下结果:

Window with the menu expanded to three menus