Qtを使ってOS Xのアプリケーションメニューを適切な場所に表示する

  • 6
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

OS X ではアプリケーションメニューと呼ばれるソフトの名前が表示された太字のメニューがファイルメニューの左側に存在しています.ここにはアプリケーションのバージョン情報や,設定,終了などのメニューがまとめられています. Windows や Linux では存在しないメニューですが, Windows や Linux との互換性を維持しながら,ここに確実にメニューを設定する方法を紹介します.

アプリケーションメニューとは

applicationmenu.png
上の画像に示したにあるメニューです.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()を呼び出すものを生成する

example1.png
example2.png

この例では「File」メニューの下に Preferences... と Quit を用意していましたが,それ以外の項目がないので実行時には「File」メニューがなくなっています.

複数該当するものがあるときには?

multiple.png
このように複数 Quit があるような場合には両方とも普通のメニューには表示されなくなって,アプリケーションメニューには下の物だけが採用されるようです.

明示的に設定する

アプリケーションメニューに入ると困る場合や,通常と違う名前を付けたものをアプリケーションメニューに表示したいときには,MenuRoleを設定します.先ほどの例であれば

ui->actionQuit->setMenuRole(QAction::QuitRole);
ui->actionQuit_B->setMenuRole(QAction::NoRole);

のようにして,QActionに対してsetMenuRoleを呼ぶことによりQuitとして扱うか,それともRoleなしで通常メニューとして扱うかを設定できます.もし,どれでもないけどアプリケーションメニューに表示したいときにはQAction::ApplicationSpecificRoleを設定しておくとAboutの下に表示してくれます.

menu1.png

menu2.png

Macはメニューがウインドウにくっついていなかったりと他のOSと挙動が若干違いますが,Qtは必要に応じてヒントを与えてあげればうまく差を吸収してくれますので,ぜひ少しだけ気に留めていただけると OS X ユーザーが喜びます.

この投稿は Qt Advent Calendar 20153日目の記事です。