メニューの例
「メニュー」の例では、メインウィンドウアプリケーションでメニューをどのように使用できるかを示しています。
メニューウィジェットには、メニューバー上のプルダウンメニューと、独立したコンテキストメニューの2種類があります。プルダウンメニューは、ユーザーが対応する項目をクリックするか、指定されたショートカットキーを押すと、メニューバーに表示されます。コンテキストメニューは通常、特定のキーボードキーを押すか、右クリックすることで呼び出されます。

メニューは、アクション項目のリストで構成されます。アプリケーションでは、多くの一般的なコマンドを、メニュー、ツールバーのボタン、およびキーボードショートカットを介して呼び出すことができます。ユーザーは、使用するユーザーインターフェースに関係なく、コマンドが同じ方法で実行されることを期待しているため、各コマンドをアクションとして表現することが有用です。
「Menus」サンプルは、QMainWindow クラスから派生した単一のクラス「MainWindow 」で構成されています。アプリケーション内でアクション項目のいずれかを選択すると、中央のウィジェットにその項目のパスが表示されます。
MainWindowクラスの定義
QMainWindow は、大きな中央ウィジェットの周囲にメニューバー、ツールバー、ドックウィジェット、ステータスバーを備えたメインアプリケーションウィンドウを提供します。
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow();
protected:
#ifndef QT_NO_CONTEXTMENU
void contextMenuEvent(QContextMenuEvent *event) override;
#endif // QT_NO_CONTEXTMENUこの例では、プルダウンメニューとコンテキストメニューの実装方法について説明します。カスタムコンテキストメニューを実装するには、メインウィンドウのコンテキストメニューイベントを受け取るために、QWidget クラスのcontextMenuEvent()関数を再実装する必要があります。
private slots:
void newFile();
void open();
void save();
void print();
void undo();
void redo();
void cut();
void copy();
void paste();
void bold();
void italic();
void leftAlign();
void rightAlign();
void justify();
void center();
void setLineSpacing();
void setParagraphSpacing();
void about();
void aboutQt();また、ユーザーがメニュー項目をアクティブにした際に反応するためのプライベートスロットの集合も実装する必要があります。これらのスロットは単純な処理(つまり、そのほとんどがメインウィンドウの中央ウィジェットにアクションのパスを表示するだけ)であるため、このドキュメントでは省略されている点に注意してください。
private:
void createActions();
void createMenus();コンストラクタを簡略化するため、さまざまなアクションを作成し、それらをメニューに追加し、メインウィンドウのメニューバーにメニューを挿入するための2つのプライベートな利便性関数を実装することにしました。
QMenu *fileMenu;
QMenu *editMenu;
QMenu *formatMenu;
QMenu *helpMenu;
QActionGroup *alignmentGroup;
QAction *newAct;
QAction *openAct;
QAction *saveAct;
QAction *printAct;
QAction *exitAct;
QAction *undoAct;
QAction *redoAct;
QAction *cutAct;
QAction *copyAct;
QAction *pasteAct;
QAction *boldAct;
QAction *italicAct;
QAction *leftAlignAct;
QAction *rightAlignAct;
QAction *justifyAct;
QAction *centerAct;
QAction *setLineSpacingAct;
QAction *setParagraphSpacingAct;
QAction *aboutAct;
QAction *aboutQtAct;
QLabel *infoLabel;
};最後に、アプリケーション全体のスコープで、各種メニューやアクション、および単純な情報ラベルを宣言します。
QMenu クラスは、メニューバー、コンテキストメニュー、およびその他のポップアップメニューで使用するためのメニューウィジェットを提供し、QAction クラスは、ウィジェットに挿入できる抽象的なユーザーインターフェースアクションを提供します。
状況によっては、アクションをグループ化することが有用な場合があります。例えば、Left Align アクション、Right Align アクション、Justify アクション、Center アクションがあり、これらの中から一度に1つだけアクティブにしたい場合などです。これを実現する簡単な方法の1つは、QActionGroup クラスを使用して、アクションをアクショングループにまとめることです。
MainWindow クラスの実装
コンストラクタでは、まず通常のQWidget を作成し、それをメインウィンドウの中央ウィジェットとして設定します。メインウィンドウがウィジェットポインタの所有権を取得し、適切なタイミングでそれを削除することに注意してください。
MainWindow::MainWindow()
{
QWidget *widget = new QWidget;
setCentralWidget(widget);
QWidget *topFiller = new QWidget;
topFiller->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
infoLabel = new QLabel(tr("<i>Choose a menu option, or right-click to "
"invoke a context menu</i>"));
infoLabel->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken);
infoLabel->setAlignment(Qt::AlignCenter);
QWidget *bottomFiller = new QWidget;
bottomFiller->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
QVBoxLayout *layout = new QVBoxLayout;
layout->setContentsMargins(5, 5, 5, 5);
layout->addWidget(topFiller);
layout->addWidget(infoLabel);
layout->addWidget(bottomFiller);
widget->setLayout(layout);次に、情報ラベルと、上部および下部のフィラーを作成し、それらをレイアウトに追加して、中央ウィジェットに配置します。QMainWindow オブジェクトには独自のカスタマイズされたレイアウトが付属しており、実際のメインウィンドウにレイアウトを設定したり、メインウィンドウを親としてレイアウトを作成したりすることはエラーとみなされます。 その代わりに、常に中央のウィジェットに独自のレイアウトを設定する必要があります。
createActions();
createMenus();
QString message = tr("A context menu is available by right-clicking");
statusBar()->showMessage(message);
setWindowTitle(tr("Menus"));
setMinimumSize(160, 160);
resize(480, 320);
}アクションやメニューを作成するには、2 つの便利関数、createActions() とcreateMenus() を呼び出します。これらについては後ほど詳しく説明します。
QMainWindow statusBar() 関数は、メインウィンドウのステータスバーを返します(ステータスバーが存在しない場合、この関数は空のステータスバーを作成して返します)。ここでは、ステータスバーとウィンドウタイトルを初期化し、ウィンドウを適切なサイズにリサイズするとともに、メインウィンドウが指定されたサイズより小さくリサイズされないようにします。
それでは、さまざまなアクションを作成するcreateActions() の利便性関数について、詳しく見ていきましょう:
void MainWindow::createActions()
{
newAct = new QAction(QIcon::fromTheme(QIcon::ThemeIcon::DocumentNew),
tr("&New"), this);
newAct->setShortcuts(QKeySequence::New);
newAct->setStatusTip(tr("Create a new file"));
connect(newAct, &QAction::triggered, this, &MainWindow::newFile);
...QAction オブジェクトには、アイコン、テキスト、ショートカット、ステータスヒント、「これは何?」テキスト、およびツールチップを含めることができます。これらのほとんどはコンストラクタで設定できますが、提供されている便利関数を使用して個別に設定することも可能です。
createActions() 関数では、まずnewAct アクションを作成し、テキストと、テーマのアイコン定数のいずれかを使用してアイコンを指定します。QAction::setShortcut()関数を使用してCtrl+N をそのショートカットに設定し、QAction::setStatusTip()関数を使用してステータスヒントを設定します(ステータスヒントは、アクションの最上位親ウィジェットが提供するすべてのステータスバーに表示されます)。 また、そのtriggered()シグナルをnewFile() スロットに接続します。
残りのアクションも同様の方法で作成されます。詳細についてはソースコードを参照してください。
alignmentGroup = new QActionGroup(this);
alignmentGroup->addAction(leftAlignAct);
alignmentGroup->addAction(rightAlignAct);
alignmentGroup->addAction(justifyAct);
alignmentGroup->addAction(centerAct);
leftAlignAct->setChecked(true);
}Left Align 、Right Align 、Justify 、およびCenter アクションを作成したら、前述のアクショングループも作成できます。
各アクションは、QActionGroup のaddAction()関数を使用してグループに追加されます。なお、グループを親としてアクションを作成することで、グループにアクションを追加することも可能です。アクショングループはデフォルトで排他的であるため、グループ内のアクションは一度に1つしかチェックされません(これはQActionGroup::setExclusive()関数を使用して変更可能です)。
すべてのアクションの作成が完了したら、createMenus() 関数を使用して、アクションをメニューに追加し、メニューをメニューバーに挿入します:
void MainWindow::createMenus()
{
fileMenu = menuBar()->addMenu(tr("&File"));
fileMenu->addAction(newAct);
fileMenu->addAction(openAct);
fileMenu->addAction(saveAct);
fileMenu->addAction(printAct);
fileMenu->addSeparator();
fileMenu->addAction(exitAct);
editMenu = menuBar()->addMenu(tr("&Edit"));
editMenu->addAction(undoAct);
editMenu->addAction(redoAct);
editMenu->addSeparator();
editMenu->addAction(cutAct);
editMenu->addAction(copyAct);
editMenu->addAction(pasteAct);
editMenu->addSeparator();
helpMenu = menuBar()->addMenu(tr("&Help"));
helpMenu->addAction(aboutAct);
helpMenu->addAction(aboutQtAct);QMenuBar addMenu() 関数は、指定されたタイトルを持つ新しい をメニューバーに追加します(メニューバーがメニューの所有権を取得することに注意してください)。 の () 関数を使用して、各アクションを対応するメニューに追加します。QMenu QWidget addAction
あるいは、QMenu クラスは、指定されたテキストやアイコンから新しいアクションを作成・追加する、いくつかのaddAction() 便利関数を提供しています。また、新しいアクションのtriggered() シグナルに自動的に接続するメンバーや、QKeySequence インスタンスで表されるショートカットを指定することもできます。
QMenu::addSeparator() 関数は、新しいセパレータアクション(つまり、QAction::isSeparator() が true を返すアクション)を作成して返し、その新しいアクションをメニューのアクション一覧に追加します。
formatMenu = editMenu->addMenu(tr("&Format"));
formatMenu->addAction(boldAct);
formatMenu->addAction(italicAct);
formatMenu->addSeparator()->setText(tr("Alignment"));
formatMenu->addAction(leftAlignAct);
formatMenu->addAction(rightAlignAct);
formatMenu->addAction(justifyAct);
formatMenu->addAction(centerAct);
formatMenu->addSeparator();
formatMenu->addAction(setLineSpacingAct);
formatMenu->addAction(setParagraphSpacingAct);
}Format メニューに注目してください。まず、QMenu のaddMenu()関数を使用して、Edit メニューのサブメニューとして追加されます。次に、配置に関するアクションを見てみましょう。createActions() 関数内で、leftAlignAct 、rightAlignAct 、justifyAct 、centerAct の各アクションをアクショングループに追加しました。しかし、アクショングループが裏で処理を行っている間も、各アクションを個別にメニューに追加する必要があります。
#ifndef QT_NO_CONTEXTMENU
void MainWindow::contextMenuEvent(QContextMenuEvent *event)
{
QMenu menu(this);
menu.addAction(cutAct);
menu.addAction(copyAct);
menu.addAction(pasteAct);
menu.exec(event->globalPos());
}
#endif // QT_NO_CONTEXTMENUカスタムコンテキストメニューを提供するには、QWidget のcontextMenuEvent()関数を再実装し、ウィジェットのコンテキストメニューイベントを受け取る必要があります(デフォルトの実装では、これらのイベントは単に無視されることに注意してください)。
このようなイベントを受信するたびに、Cut 、Copy 、Paste の各アクションを含むメニューを作成します。 コンテキストメニューは、popup() 関数を使用して非同期に実行することも、exec() 関数を使用して同期に実行することもできます。この例では、exec() 関数を使用してメニューを表示することにしました。引数としてイベントの位置を渡すことで、コンテキストメニューが期待される位置に表示されるようにしています。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.