이 페이지에서

메뉴 예제

'메뉴' 예제는 메인 윈도우 애플리케이션에서 메뉴를 사용하는 방법을 보여줍니다.

메뉴 위젯은 메뉴 바에 있는 풀다운 메뉴이거나 독립형 컨텍스트 메뉴일 수 있습니다. 풀다운 메뉴는 사용자가 해당 항목을 클릭하거나 지정된 단축키를 누르면 메뉴 바에 표시됩니다. 컨텍스트 메뉴는 일반적으로 특정 키보드 키를 누르거나 마우스 오른쪽 버튼을 클릭하여 호출됩니다.

‘편집’ 메뉴가 열린 상태의 애플리케이션

메뉴는 일련의 작업 항목으로 구성됩니다. 애플리케이션에서는 메뉴, 툴바 버튼 및 키보드 단축키를 통해 다양한 일반적인 명령을 호출할 수 있습니다. 사용자는 사용하는 사용자 인터페이스에 관계없이 명령이 동일한 방식으로 실행되기를 기대하므로, 각 명령을 하나의 작업으로 표현하는 것이 유용합니다.

'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();

우리는 다양한 액션을 생성하고, 이를 메뉴에 추가하며, 메인 창의 메뉴 바에 메뉴를 삽입하기 위한 두 개의 비공개 편의 함수를 구현함으로써 생성자를 단순화하기로 했습니다.

    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 ` 액션이 있고, 이 중 한 번에 하나의 액션만 활성화되도록 하고 싶을 때가 있습니다. 이를 달성하는 간단한 방법 중 하나는 ` 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);
}

액션과 메뉴를 생성하기 위해 두 가지 편의 함수인 ` 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() 함수를 사용하여 그룹에 추가됩니다. 또한, 그룹을 상위 요소로 지정하여 액션을 생성함으로써 그룹에 액션을 추가할 수도 있습니다. 액션 그룹은 기본적으로 배타적이므로, 그룹 내의 액션 중 한 번에 하나만 선택된 상태로 유지됩니다(이는 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() 함수를 사용하여 메뉴를 표시하도록 했습니다. 이벤트의 위치를 인자로 전달함으로써 컨텍스트 메뉴가 예상된 위치에 나타나도록 보장합니다.

예제 프로젝트 @ code.qt.io

© 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.