【问题标题】:How to convert QMenu to QMenuBar?如何将 QMenu 转换为 QMenuBar?
【发布时间】:2018-09-20 14:24:13
【问题描述】:

我有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;
}

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

如何解决这个问题?

【问题讨论】:

  • 将 QMenu 转换为 QMenuBar 是什么意思?,QMenu 可以是 QMenuBar 的一部分,您能否更好地解释一下您想要获得的内容,也许图像会有所帮助

标签: c++ qt qt5


【解决方案1】:

您不需要那种“转换”。如果你仔细阅读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”、“2”、“3”菜单。这不是解决方案。
【解决方案2】:

原因

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

我冒昧地扩展了这个例子,以便在菜单栏中的 compactextended 形式的菜单之间切换(此处未显示)。完整代码可在GitHub 获得。

结果

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

【讨论】:

    猜你喜欢
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    相关资源
    最近更新 更多