Qtの入門書(※1)のサンプルをいじっているのですが、作成するアプリケーションが一つのメソッドの動作を確かめるためには割と大きくて、各処理がちゃんとどう実行できるか確かめるために小さなアプリケーションを作成したところ、若干つまずいた部分があったので、メモ。
とりあえず、windowを出して、終了だけできるアプリケーションを実装してみた。そこで、下記のコードのように、ファイルメニュー、ヘルプメニューを作成してみた所、予想としていた結果と違う結果が出てしまった。
void MainWindow::createMenus() { fileMenu = menuBar()->addMenu(tr("&File")); fileMenu->addAction(showTestAction); fileMenu->addAction(exitAction) helpMenu = menuBar()->addMenu(tr("&Help")); helpMenu->addAction(aboutAction); helpMenu->addAction(aboutQtAction); }
で結果がこれ。
ヘルプメニューは表示されないし、ファイルメニューに設定したはずのメニューはなんか「winTest」っていう特に設定していない(アプリケーション名の)メニューの方に追加されてしまっているし、利用する分には、問題なかったとしても、想像していたのと違う動きをしているのでちょっと調べてみた。
で、Qt本家の記事(http://doc.trolltech.com/4.5/mac-differences.html#menu-bar)によると結局、OSネイティブの使用に合わせてラッパーをつくっているので、上のでwinTestに出ているものに関しては、自動的にこちらのメニューに追加されてしまうみたい。
とはいえ、どういうタイミングでこのメニューに追加されてしまうのかというのがわからなかったので、いろいろといじってみた所。下のコードを
void MainWindow::createActions() { //------------ 略 ----------------// aboutAction = new QAction("&About",this); aboutAction->setStatusTip("Show about this application."); connect(aboutAction,SIGNAL(triggered()), this,SLOT(aboutTest())); //------------ 略 ----------------// }
このように書き換えてみると
void MainWindow::createActions() { //------------ 略 ----------------// aboutAction = new QAction("&Bout",this); aboutAction->setStatusTip("Show about this application."); connect(aboutAction,SIGNAL(triggered()), this,SLOT(aboutTest())); //------------ 略 ----------------// }こんな感じの結果になった。
というわけで、原因はここにあるという事はわかった。実装上の仕組みはまだよくわかっていないので、設定方法の仕組みがわかったら、またメモろうとは思いますが。
とりあえず、Macのメニューの設定時にびっくりしないようにメモ。
※1「入門 Qt 4 プログラミング」
Jasmin Blanchette (著), Mark Summerfield (著), 杵渕 聡 (翻訳), 杉田 研治 (翻訳)
- amazon