C++ Qt隐藏空子菜单

C++ Qt隐藏空子菜单,c++,qt,C++,Qt,我在父菜单中有一些子菜单。在一些&QMenu::aboutToShow代码之后,一些子菜单的操作被隐藏,有时子菜单被保留为空(其中没有任何操作) 如何自动隐藏这些空的子菜单?很难说没有看到您的代码,但是。。。我猜真正的问题不是隐藏空的子菜单本身,而是在其父菜单中隐藏与子菜单关联的“标记”文本。为此,您需要隐藏与子菜单关联的QAction,而不是简单地隐藏子菜单 以下内容似乎是(我认为)你想要做的 void hide_the_empties (QMenu *menu) { if (!menu)

我在父菜单中有一些子菜单。在一些
&QMenu::aboutToShow
代码之后,一些子菜单的操作被隐藏,有时子菜单被保留为空(其中没有任何操作)


如何自动隐藏这些空的子菜单?

很难说没有看到您的代码,但是。。。我猜真正的问题不是隐藏空的子菜单本身,而是在其父菜单中隐藏与子菜单关联的“标记”文本。为此,您需要隐藏与子菜单关联的
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代码。我想在代码中,你可以循环子菜单并隐藏那些空的。