Qt/C++ による GUI ソフト 2:メニューバー

このページでは,GUI ソフトウェアのメニューバーを作成してみます.
独自メインウィンドウの基底となるクラス QMainWindow には,QMenuBar へのポインタを返す関数があるので,これを使います.
素材となるコードは,1:メインウィンドウで作成した,メインウィンドウを表現する独自クラス Main_Window です.

Before : 1:メインウィンドウ Next : 3:シグナルとスロット

インフォメーション

ドキュメント

Menus Example は即参考になりそうです.
以下は,メニューを作成するのに使われる関数やクラスへのリンクです.

Qt のオブジェクトがいくつか出てくるので,関係を整理しておきます.

  1. 独自クラス Main_Window は QMainWindow を継承しています
  2. その基底となったクラス QMainWindow からは,メニューバー QMenuBar へのポインタが取得できます
  3. QMenuBar には,[ファイル] や [表示] といったメニュー QMenu が追加できます
  4. 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 アプリケーションのビルドに使用されるヘッダ開発ファイル

目次(ページ内リンク)




メニューにアクションを追加

メニューの中に,アクション == QAction クラスのインスタンスを追加します.

この例では [ファイル(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:シグナルとスロットで動作するようにします.