Qt隐藏空子菜单
问题描述:
我有一些孩子QMenu
在父菜单内。在我有一些&QMenu::aboutToShow
代码之后,一些子菜单的操作被隐藏,有时子菜单被留空(没有任何内部操作)。Qt隐藏空子菜单
如何自动隐藏这些空子菜单?
答
很难说没有看到你的代码,但...我猜真正的问题不是隐藏空子菜单本身,而是隐藏与其子菜单相关联的“标签”文本在其父。为此,您需要隐藏与子菜单关联的QAction
,而不是简单地隐藏子菜单。
下似乎做什么(我觉得)你想...
void hide_the_empties (QMenu *menu)
{
if (!menu)
return;
/*
* The following statement is the one I think you need to
* add to your own aboutToShow implementation.
*/
menu->menuAction()->setVisible(!menu->isEmpty());
if (!menu->isEmpty()) {
for (auto action: menu->actions()) {
if (auto m = action->menu()) {
hide_the_empties(m);
}
}
}
}
测试了...
QMenu menu;
menu.addAction("First");
menu.addAction("Second");
/*
* Add empty submenu.
*/
auto *sm = menu.addMenu("Not empty if you can see this");
menu.addAction("Third");
QObject::connect(&menu, &QMenu::aboutToShow,
[&]()
{
hide_the_empties(&menu);
});
menu.exec(QCursor::pos());
/*
* Populate submenu.
*/
auto *a1 = sm->addAction("Sub action 1");
auto *a2 = sm->addAction("Sub action 2");
menu.exec(QCursor::pos());
/*
* Clear submenu again.
*/
sm->clear();
menu.exec(QCursor::pos());
我认为这将是一个好主意,你要包括QMenu :: aboutToShow代码你有。我想,在那个代码中,你可以遍历子菜单并隐藏那些空的。 – user2672165