Причина
for(QMenu* menu: menu->menus()) {
QMenu
не имеет метода menus
.
Решение
Путь к тому месту, куда вы хотите, немного длиннее:
- Используйте QWidget :: actions , чтобы получить список действий, добавленных в меню
- Получите
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 .
Результат
Как написано, данный пример дает следующий результат: