Qt/C++ による GUI ソフト 2:メニューバー
このページでは,GUI ソフトウェアのメニューバーを作成してみます.
独自メインウィンドウの基底となるクラス QMainWindow には,QMenuBar へのポインタを返す関数があるので,これを使います.
素材となるコードは,1:メインウィンドウで作成した,メインウィンドウを表現する独自クラス Main_Window です.
インフォメーション
ドキュメント
Menus Example は即参考になりそうです.
以下は,メニューを作成するのに使われる関数やクラスへのリンクです.
- QMainWindow Class の QMenuBar *QMainWindow::menuBar() const 関数でメニューバーを取得
- QMenuBar Class
- QMenu Class
- QAction Class:「終了」や「開く」といったアクション
Qt のオブジェクトがいくつか出てくるので,関係を整理しておきます.
- 独自クラス Main_Window は QMainWindow を継承しています
- その基底となったクラス QMainWindow からは,メニューバー QMenuBar へのポインタが取得できます
- QMenuBar には,[ファイル] や [表示] といったメニュー QMenu が追加できます
- QMenu には,[終了] や [開く] といったアクション QAction が追加できます
Qt では,「メニュー項目を選んで実行」といった感じで表現する操作は,「QAction を選んで操作」ということになります.
インフォメーション
インストールした Debian パッケージ
このページは Debian 13 trixie で作成しています.
| パッケージ名(バージョン) | 注 |
| g++(14.2.0) | GNU C++ コンパイラ |
| make(4.4.1) | コンパイルを制御するユーティリティ |
| qt6-base-dev(6.8.2) | Qt6 アプリケーションのビルドに使用されるヘッダ開発ファイル |
目次(ページ内リンク)
- 空のメニューバーを作成
- メニューバーにメニューを追加:メニューバーに [ファイル(F)] を追加します
- メニューにアクションを追加:[ファイル(F)] のなかに [開く(O)] と [終了(Q)] を作成します
メニューにアクションを追加
メニューの中に,アクション == QAction クラスのインスタンスを追加します.
- [ファイル(F)]-[終了(Q)]
- [表示(V)]-[ON(N)] および [表示(V)]-[OFF(F)]
この例では [ファイル(F)] と [表示(V)] がメニューであり,[終了(Q)],[ON(N)],および [OFF(F)] がアクションです.
メニューは上のセクションで作成済みです.アクションを新規作成します.
ソースコード
main_window.h
#include <QMainWindow>
#include <QMenuBar>
class Main_Window : public QMainWindow {
private:
QMenuBar *menu_bar;
QMenu *file_menu;
QMenu *view_menu;
QAction *action_quit; //アクションの宣言
QAction *action_ball_stick;
QAction *action_spacefill;
public:
Main_Window(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
};
main_window.cc
ここで使っているコンストラクタは,QAction::QAction(const QString &text, QObject *parent = nullptr) です.const QString &text がメニューアクションとして表示されることになります.
生成したアクションは,void QWidget::addAction(QAction *action) を使ってメニューに追加されます.
アクションはデフォルトで有効になっているのですが,void QAction::setEnabled(bool) で有効/無効を変更できます.
この関数は Public Slots です.何らかのシグナルで有効/無効を変更することを前提とした仕様のようです.
#include "main_window.h"
Main_Window::Main_Window(QWidget *parent, Qt::WindowFlags f)
: QMainWindow(parent, f),
menu_bar(menuBar())
{
resize(320, 240);
setWindowTitle("Main_Window");
file_menu = new QMenu("ファイル(&F)", this);
menu_bar->addMenu(file_menu);
view_menu = new QMenu("表示(&V)", this);
menu_bar->addMenu(view_menu);
action_quit = new QAction("終了(&Q)", this); //アクションの生成
file_menu->addAction(action_quit); //メニューにアクションを追加
action_ball_stick = new QAction("棒球(&B)", this);
action_ball_stick->setEnabled(false); //アクションの無効化
view_menu->addAction(action_ball_stick);;
action_spacefill = new QAction("空間充填(&S)", this);
view_menu->addAction(action_spacefill);;
}
main.cc および window.pro
変更が無いので省略します.
ビルドと実行
手順は上と同じです.
~/tmp$ qmake6
~/tmp$ make
~/tmp$ ./my_window &
画像は実行して [表示{V)] を選択したところです.2 個のアクション [棒球(B)] と [空間充填(S)] が表示されました.
[空間充填(S)] が途切れています.何か表示幅を設定する機能があるのでしょう.
[棒球(B)] が無効化されているので,選択もできなくなっています.色が薄くなっており,マウスカースルをポイントしても色が変わりません.
ここで作成したアクションは,まだ雛形で動作しません.次のページ,3:シグナルとスロットで動作するようにします.