5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

QtAdvent Calendar 2015

Day 3

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

Posted at

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 ユーザーが喜びます.

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?