首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将QMenu转换为QMenuBar?

如何将QMenu转换为QMenuBar?
EN

Stack Overflow用户
提问于 2018-09-20 14:24:13
回答 2查看 865关注 0票数 0

我有QMenu,它包含子菜单:

代码语言:javascript
复制
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

代码语言:javascript
复制
QMenuBar* menubar = convertFromQMenu(&menu);

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

代码语言:javascript
复制
QMenuBar* convertFromQMenu(QMenu* menu) {
    QMenuBar *menubar = new QMenuBar();
    /*
    for(QMenu* menu: menu->menus()) {
        menu.setParent(menubar);
        menubar.addMenu(menu);
    }
    */

    return menubar;
}

但是,注释的代码不编译。

怎么解决这个问题?

EN

回答 2

Stack Overflow用户

发布于 2018-09-20 14:46:33

你不需要那种“转换”。如果您仔细阅读Qt官方文档中关于QMenuBar和addMenu()成员的内容,您可以轻松地将您的QMenu添加到您的QMenuBar中:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-09-24 01:44:39

原因

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

QMenu没有menus方法。

解决方案

要到达你想去的地方,要走的路要长一点:

  1. 使用QWidget::操作获取操作列表,并添加到菜单中
  2. 使用QMenu获取与每个操作关联的QAction::菜单

现在可以将菜单添加到QMenuBar中。

注意:不会改变菜单和子菜单的养育方式。

示例

基于您的代码,我建议您这样实现convertFromQMenu

代码语言:javascript
复制
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;
}

下面是如何测试建议的实现:

代码语言:javascript
复制
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);
}

我冒昧地扩展了这个例子,以便在菜单栏中紧凑的菜单和扩展的菜单之间切换(这里没有显示)。完整的代码可在GitHub上使用。

结果

如前所述,给定的示例产生以下结果:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52427391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档