我有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;
}
但是,注释的代码不编译。
怎么解决这个问题?
发布于 2018-09-20 06:46:33
你不需要那种“转换”。如果您仔细阅读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);
发布于 2018-09-23 17:44:39
原因
for(QMenu* menu: menu->menus()) {
QMenu
没有menus
方法。
解决方案
要到达你想去的地方,要走的路要长一点:
QMenu
获取与每个操作关联的QAction::菜单现在可以将菜单添加到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上使用。
结果
如前所述,给定的示例产生以下结果:
https://stackoverflow.com/questions/52427391
复制