QMenuBarからメニューを探す方法

QTでウインドウのメニューバーを作るときはQMenuBarを使います。

このQMenuBar内のメニュー(QMenu)は次の3種類のウィジェットから成り立っています。

それぞれ別々の機能を持っていますが、QMenuにとってはメニューもセパレーターもQActionと同じように扱われます。

例えば次のようなメニューバーを持つウインドウを考えます。

ファイルメニューが展開しているメニューバー

「ファイル」メニューを見るとメニューが2つあります。

これらのメニューは直接QMenuとしては取得できません。

そういう関数があってもよさそうですが、QMenuBarQMenuにもそれらしい関数は定義されていません。

もしメニューにあるすべての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プロパティの値)のことです。

以上、メニューバーから子メニューだけを探し出す方法でした。

では、また!

関連項目
プライバシーポリシー