OS X ではアプリケーションメニューと呼ばれるソフトの名前が表示された太字のメニューがファイルメニューの左側に存在しています.ここにはアプリケーションのバージョン情報や,設定,終了などのメニューがまとめられています. Windows や Linux では存在しないメニューですが, Windows や Linux との互換性を維持しながら,ここに確実にメニューを設定する方法を紹介します.
アプリケーションメニューとは
上の画像に示したにあるメニューです.WindowsやLinuxには存在しません.なので,OS X向けには若干特別扱いしてあげる必要があります.
基本は名前から自動判別
QMenuBarのドキュメントにも書いてある通り,基本的には名前から自動的に判別されます.アプリケーション名はInfo.plistから取得されます.
文字列マッチ | 場所 | メモ |
---|---|---|
about.* | Application Menu → About | なければ表示しない |
config, options, setup, settings or preferences | Application Menu → Preferences | なければ表示しない |
quit or exit | Application Menu → Quit | なければQApplication::quit()を呼び出すものを生成する |
この例では「File」メニューの下に Preferences... と Quit を用意していましたが,それ以外の項目がないので実行時には「File」メニューがなくなっています.
複数該当するものがあるときには?
このように複数 Quit があるような場合には両方とも普通のメニューには表示されなくなって,アプリケーションメニューには下の物だけが採用されるようです.
明示的に設定する
アプリケーションメニューに入ると困る場合や,通常と違う名前を付けたものをアプリケーションメニューに表示したいときには,MenuRoleを設定します.先ほどの例であれば
ui->actionQuit->setMenuRole(QAction::QuitRole);
ui->actionQuit_B->setMenuRole(QAction::NoRole);
のようにして,QAction
に対してsetMenuRole
を呼ぶことによりQuitとして扱うか,それともRoleなしで通常メニューとして扱うかを設定できます.もし,どれでもないけどアプリケーションメニューに表示したいときにはQAction::ApplicationSpecificRole
を設定しておくとAboutの下に表示してくれます.
Macはメニューがウインドウにくっついていなかったりと他のOSと挙動が若干違いますが,Qtは必要に応じてヒントを与えてあげればうまく差を吸収してくれますので,ぜひ少しだけ気に留めていただけると OS X ユーザーが喜びます.