QMenuBarからメニューを探す方法
QTでウインドウのメニューバーを作るときはQMenuBarを使います。
このQMenuBar内のメニュー(QMenu)は次の3種類のウィジェットから成り立っています。
- アクション(QAction)
- メニュー(QMenu)
- セパレーター(区切り線)
それぞれ別々の機能を持っていますが、QMenuにとってはメニューもセパレーターもQActionと同じように扱われます。
例えば次のようなメニューバーを持つウインドウを考えます。
「ファイル」メニューを見るとメニューが2つあります。
これらのメニューは直接QMenuとしては取得できません。
そういう関数があってもよさそうですが、QMenuBarやQMenuにもそれらしい関数は定義されていません。
もしメニューにあるすべてのQActionを取得するだけならactions関数が使えます。
QList<QAction*> actions = menuFile->actions();
しかし、actionsにはメニュー内にある子メニューやセパレーターもすべて含まれてしまいます。
なのでメニューだけを取得することはできません。
では、どうしたらQMenuだけ取得できるかというとQObject::findChildlenを使います。
これはQObjectの子要素を再帰的に探せる便利な関数です。
ここではメニューから直下の子メニューだけを探そうとしているのでこう書けます。
QList<QMenu*> childMenus = menuFile->findChildren<QMenu*>(
QString(), Qt::FindDirectChildrenOnly);
検索方法にはQt::FindDirectChildrenOnlyを指定することで直下のメニューだけを検索できます。
再帰的に探すならQt::FindChildrenRecursivelyフラグに変えるだけです。
ちなみにfindChildを使うと名前から直接オブジェクトを探すことも可能です。
QMenu * menuFile = menuBar()->findChild<QMenu*>("menuFile");
ここでいう名前はQtCreatorのレイアウト画面などでオブジェクトにつけた名前(objectNameプロパティの値)のことです。
以上、メニューバーから子メニューだけを探し出す方法でした。
では、また!