Как конвертировать QMenu в QMenuBar? - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть 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 голосов
/ 24 сентября 2018

Причина

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

QMenu не имеет метода menus.

Решение

Путь к тому месту, куда вы хотите, немного длиннее:

  1. Используйте QWidget :: actions , чтобы получить список действий, добавленных в меню
  2. Получите QMenu, связанное с каждым действием, используя QAction :: menu

Теперь вы можете добавить меню в 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

0 голосов
/ 20 сентября 2018

Вам не нужно такого рода «обращение».Если вы внимательно прочитали из официального сообщения 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);

Если вы хотите использовать меню QMainWindowbar, doc гласит:

В большинстве приложений в стиле главного окна вы используете функцию menuBar (), предоставляемую в QMainWindow, добавляя QMenus в строку меню и добавляя QActions во всплывающие меню.

Пример (из примера меню):

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

fileMenu->addAction(newAct);

...