概要
- QAction はトリガー/チェック可能なユーザインタフェース(UI)要素を抽象化したもの
- QWidgetに配置可能。通常はメニュー、ツールバーに配置し、ユーザの操作により triggered()/toggled() 等のシグナルを発行することが出来る
- QAction オブジェクトには以下の様な属性を設定することが出来る
- テキスト
- アイコン画像・アイコンテキスト
- ショートカットシーケンス
- ツールチップテキスト
- ステータスバーに表示される説明テキスト
- チェック状態
全てのプロパティを知りたければヘルプを参照すること
- QAction オブジェクトの配置例:
- MFC/Windows では数値で表されるメッセージIDまたはコマンドIDによりUI要素がシンボライズされる(単に通し番号が割り振られているだけ)が、 QAction はそれより抽象度が高く強力で情報が一元管理されていて取り扱いが簡単 (ICカードにすべての情報が格納されてて、セキュリティ・電車・バス・自販機など色々利用出来るみたいな感じ)
- メニュー・ツールバーで QAction オブジェクトが選択されると triggered() 等のシグナルが発行される
- 設定されたショートカットシーケンスのキーが押された場合にも triggered() 等のシグナルが発行される
- QAction の処理は、シグナルにコネクトされたスロットにより行われる
- QAction オブジェクト関連の処理は以下の順序で行う
- createActions(): 各アクションの QAction オブジェクト生成、属性設定、コネクト
- createMenus(): メニューに配置
- createToolBars(): ツールバーに配置
QAction オブジェクトの生成
- 通常、全ての QAction オブジェクトは MainWindow がポインターとして保持する
1: #include <QtGui/QMainWindow> 2: class QAction; 3: class QMenu; 4: 5: class MainWindow : public QMainWindow 6: { 7: Q_OBJECT 8: ..... 9: private: 10: QAction *newAct; // 新規文書作成 11: QAction *openAct; // ファイルオープン 12: QAction *saveAsAct; // 名前を付けて保存 13: ..... 14: QMenu *fileMenu; // File メニュー 15: QMenu *editMenu; // 編集メニュー 16: ..... 17: };
- 通常は MainWindow コンストラクタから呼ばれる createActions() の中で QAction オブジェクトの生成を行う
1: MainWindow::MainWindow(QWidget *parent, Qt::WFlags flags) 2: : QMainWindow(parent, flags) 3: { 4: ..... 5: createActions(); // QAction たちを生成 6: createMenus(); // メニューを生成 7: createToolBars(); // ツールバーを生成 8: ..... 9: } 10: 11: void MainWindow::createActions() 12: { 13: newAct = new QAction(QIcon(":nxiiDraw/Resources/images/new.png"), tr("&New"), this); 14: newAct->setShortcuts(QKeySequence::New); // 定義済みキーシーケンス使用 15: newAct->setStatusTip(tr("Create a new document")); 16: connect(newAct, SIGNAL(triggered()), this, SLOT(newFile())); 17: ..... 18: saveAsAct = new QAction(tr("Save&As..."), this); // アイコン指定無し 19: saveAsAct->setShortcuts(QKeySequence::SaveAs); 20: saveAsAct->setStatusTip(tr("Save the document under a new fileName")); 21: connect(saveAsAct, SIGNAL(triggered()), this, SLOT(saveAs())); 22: ..... 23: }
- QAction コンストラクタに QIcon オブジェクトを指定することで、アイコン属性を付加することが出来る
アイコンファイルのアドレスは、':'(コロン)で始まる .qrc 内のアドレスを使用するアイコン画像ファイルには、任意サイズの png gif bmp などが利用可能。
アイコン画像は ICONIZER 等のアイコンジェネレータを使うと便利
リソースアイテムの追加手順:左側のペインでプロジェクトを選び、右クリックメニューで、「新しいファイルを追加」を実行し、「Qt リソースファイル」を選んで【選択】
- QAction オブジェクトを生成したら、必要に応じてショートカット等のプロパティを設定する
- ショートカットキーは Qt 標準のもの
(参照: QKeySequence::StandardKey)
に加え、QKeySequence() で任意のキーシーケンスを設定することも出来る
1: redoEditAct->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_J));
- 通常のアクションは、triggered() シグナルを処理スロットにコネクトする
- チェック状態を持つアクションは setCheckable(true) を実行し、toggled(bool) シグナルを処理スロットにコネクトする
1: viewGridAct = new QAction(tr("view &Grid"), this); 2: viewGridAct->setCheckable(true); 3: connect(viewGridAct, SIGNAL(toggled(bool)), this, SLOT(setViewGrid(bool)));
QMenu への配置
- 通常は MainWindow コンストラクタから呼ばれる createMenus() の中でメニューオブジェクトの生成・設定を行う
- メニュー項目の設定は addMenu() または addAction() で行うことが出来る
1: void MainWindow::createMenus() 2: { 3: fileMenu = menuBar()->addMenu(tr("&File")); 4: fileMenu->addAction(newAct); 5: fileMenu->addAction(openAct); 6: ..... 7: editMenu = menuBar()->addMenu(tr("&Edit")); 8: editMenu->addAction(undoAct); 9: editMenu->addAction(redoAct); 10: ..... 11: }
- QMainFrame::menuBar() はメインフレームメニューバーへのポインタを返す
- QAction オブジェクトにアイコンが設定されていれば、アイコンが自動的に表示される
- QAction オブジェクトがチェック可能であれば、チェック状態が自動的に表示される
QToolBar への配置
- 通常は MainWindow コンストラクタから呼ばれる createToolBars() の中でツールバーオブジェクトの生成・設定を行う
1: void MainWindow::createToolBars() 2: { 3: fileToolBar = addToolBar(tr("File")); // File ツールバー生成 4: fileToolBar->addAction(newAct); 5: fileToolBar->addAction(openAct); 5: .... 6: }
- ツールバーの生成&追加は QMainFrame::addToolBar(ツールバー名) により行う
- 指定したツールバー名は、ツールバーを右ボタンクリックして表示されるメニューに表示される。
- QToolBar::addAction() により、ツールバーにアクションオブジェクトを配置できる
- QAction オブジェクトにアイコンが設定されていれば、アイコンが自動的に表示される
- アイコンを設定せず、テキストを設定している場合は、設定したテキストが表示される
- QAction オブジェクトがチェック可能であれば、チェック状態が自動的に表示される
- マウスポインターをアイコンに合わせ、少し待つと下図の様に ToolTips テキストが表示される。
ToolTipsテキストが設定されていない場合は(QAction コンストラクタで指定可能な) text プロパティ文字列が表示される。
QToolBar
- ツールバーには QAction だけでなく、addWidget() により QLineEdit などの任意のウィジットを配置することができる。
- QToolButton を使用すると、下図のようにツールバーにドロップダウンメニューを配置することができる
- QToolButton::setPopupMode(QToolButton::MenuButtonPopup) で QToolButton オブジェクトにメニューを配置可能になる
- QToolButton::setMenu(QMenu * menu) でメニューツリーを設定する
1: gradientToolButton = new QToolButton; 2: gradientToolButton->setToolTip(tr("gradient")); 3: gradientToolButton->setPopupMode(QToolButton::MenuButtonPopup); 4: gradientToolButton->setMenu(createGradientMenu()); 5: gradientAction = gradientToolButton->menu()->defaultAction(); 6: colorToolBar->addWidget(gradientToolButton);
- ボタンを押したときのアクションは setDefaultAction ( QAction * action ) で設定可能
- 空のメニューを設定し、QMenu::aboutToShow() シグナルを処理してやれば、 ドロップダウンメニューでなくダイアログを表示するなどの凝ったUIも作れるらしい(筆者は未経験)
QButtonGroup, QActionGroup
- QButtonGroup を使用すると、ラジオボタンの様に複数のチェック可能なボタンの状態を排他的にすることができる
- QButtonGroup オブジェクトを生成し、排他的にしたいボタンを addButton() で追加する
- ボタンオブジェクトはツールバーに addWidget() する
1: // 左右アラインメント 2: hAlignGroup = new QButtonGroup(this); 3: // 左揃え 4: QToolButton *alignLeftButton = new QToolButton; 5: alignLeftButton->setToolTip(tr("align left")); 6: alignLeftButton->setCheckable(true); 7: alignLeftButton->setChecked(true); 8: alignLeftButton->setIcon(QIcon(":nxiiDraw/Resources/images/alignLeft.png")); 9: hAlignGroup->addButton(alignLeftButton, int(Qt::AlignLeft)); 10: textToolBar->addWidget(alignLeftButton); 11: connect(alignLeftButton, SIGNAL(clicked()), this, SLOT(alignLeftButtonTriggered())); 12: // 中央揃え 13: QToolButton *alignCenterButton = new QToolButton; 14: hAlignGroup->addButton(alignCenterButton, int(Qt::AlignHCenter)); 15: ..... 16: // 右揃え 17: QToolButton *alignRightButton = new QToolButton; 18: hAlignGroup->addButton(alignRightButton, int(Qt::AlignRight)); 19: .....
- メニューで QAction のチェック状態を排他的にしたい場合は QActionGroup を使用する。使い方は QButtonGroup とほほ同様。
1: pointerActGroup = new QActionGroup(this); 2: pointerActGroup->setExclusive(true); 3: pointerActGroup->addAction(pointerButtonAct); 4: pointerActGroup->addAction(textButtonAct); 5: ..... 6: QMenu *pointer = editMenu->addMenu(tr("&Tool")); 7: pointer->addAction(pointerButtonAct); 8: pointer->addAction(textButtonAct); 9: .....
まとめ
- QAction と ToolBar に関係する QToolButton などを具体的なソースコードを示して解説した。
- QAction は簡単で強力で使いやすいことを理解していただけたと思う
次回はレイアウトのお話をする予定
演習問題
- 新規プロジェクトを作成し、QAction を使ってアバウトメニュー・アイコンを選択するとアバウトダイアログが表示されるようにしなさい (アバウトダイアログ自体は QMessageBox を使用するとよい)
- QAction に任意のキーシーケンス(例えば、Ctrl + X, Ctrl + S で保存)を設定して、動作確認してみなさい
- 下図の様にテキストを下部に配置するアイコンを持つ QAction オブジェクトをツールバーに配置してみなさい
- QAction オブジェクトをステータスバーに配置することが出来るかどうかを確かめなさい
- メニューにもツールバーにも表示されないQActionをキーでトリガーするにはどうしたらよいか?
- ツールバー上のボタンにより、基本メニュー・高度なメニューを切り替え可能にしなさい
- QToolButton の▼を押すとカラーピックアップダイアログを開いて色を選択可能にしなさい