[英]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
方法。
到達所需位置的路徑要長一點:
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.