2017-05-26 160 views
0

我有一些孩子QMenu在父菜單內。在我有一些&QMenu::aboutToShow代碼之後,一些子菜單的操作被隱藏,有時子菜單被留空(沒有任何內部操作)。Qt隱藏空子菜單

如何自動隱藏這些空子菜單?

+0

我認爲這將是一個好主意,你要包括QMenu :: aboutToShow代碼你有。我想,在那個代碼中,你可以遍歷子菜單並隱藏那些空的。 – user2672165

回答

1

很難說沒有看到你的代碼,但...我猜真正的問題不是隱藏空子菜單本身,而是隱藏與其子菜單相關聯的「標籤」文本在其父。爲此,您需要隱藏與子菜單關聯的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());