2017-05-26 12 views
0

私は親メニューの中にいくつかの子供QMenuを持っています。 &QMenu::aboutToShowコードの後に​​、サブメニューのいくつかのアクションが隠され、サブメニューが空のまま残されることがあります(アクションはありません)。Qt空のサブメニューを非表示

これらの空のサブメニューを自動的に非表示にするにはどうすればよいですか?

+0

でテスト

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 :: aboutToShowコード。私はそのコードでは、サブメニューをループして空のものを隠すかもしれないと思います。 – user2672165

答えて

1

コードを見ることなく言うのは難しいですが...実際の問題は、空のサブメニュー自体を隠すのではなく、親のサブメニューに関連付けられた「タグ」テキストを隠すことではないと思います。そのためには、単にサブメニューを隠すのではなく、サブメニューに関連付けられたQActionを隠す必要があります。

次は、私はあなたが含まれるようにするために、それは良いアイデアだと思う...

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()); 
関連する問題