簡體   English   中英

如何將QMenu轉換為QMenuBar?

[英]How to convert QMenu to QMenuBar?

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

但是,注釋的代碼無法編譯。

如何解決這個問題?

您不需要這種“轉換”。 如果您仔細閱讀Qt官方文檔中有關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);

原因

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

我隨意擴展了這個示例,以便在菜單欄中的緊湊菜單和擴展菜單之間切換(此處未顯示)。 完整代碼可在GitHub上獲得

結果

如所寫,給定的示例產生以下結果:

帶有菜單的窗口擴展為三個菜單

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM