我有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;
}
但是,注释的代码无法编译。
该如何解决?
答案 0 :(得分:0)
您不需要这种“转换”。如果您从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 :(得分:0)
for(QMenu* menu: menu->menus()) {
QMenu
没有menus
方法。
到达您想要的位置的路径稍长一些:
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);
}
我可以随意扩展此示例,以在菜单栏中的菜单 compact 和 extended 形式之间切换(此处未显示)。完整的代码位于GitHub上。
如所写,给定的示例将产生以下结果: