메뉴 예제

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

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

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

메뉴 예제는 QMainWindow 클래스에서 파생된 단일 클래스 MainWindow 로 구성됩니다. 애플리케이션에서 액션 항목 중 하나를 선택하면 중앙 위젯에 해당 항목의 경로가 표시됩니다.

메인윈도우 클래스 정의

QMainWindow 는 커다란 중앙 위젯 주위에 메뉴 모음, 도구 모음, 독 위젯 및 상태 표시줄이 있는 메인 애플리케이션 창을 제공합니다.

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow();

protected:
#ifndef QT_NO_CONTEXTMENU
    void contextMenuEvent(QContextMenuEvent *event) override;
#endif // QT_NO_CONTEXTMENU

이 예제에서는 풀다운 메뉴와 컨텍스트 메뉴를 구현하는 방법을 살펴보겠습니다. 사용자 정의 컨텍스트 메뉴를 구현하려면 QWidgetcontextMenuEvent() 함수를 다시 구현하여 메인 창에 대한 컨텍스트 메뉴 이벤트를 수신해야 합니다.

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() 이라는 두 가지 편의 함수를 호출합니다. 이에 대해서는 곧 다시 설명하겠습니다.

QMainWindowstatusBar() 함수는 메인 창의 상태 표시줄을 반환합니다(상태 표시줄이 없는 경우 이 함수는 빈 상태 표시줄을 생성하여 반환합니다). 상태 표시줄과 창 제목을 초기화하고, 창 크기를 적절한 크기로 조정하고, 기본 창 크기를 지정된 크기보다 작게 조정할 수 없도록 합니다.

이제 다양한 동작을 생성하는 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 액션을 만들었으면 앞서 언급한 액션 그룹도 만들 수 있습니다.

각 액션은 QActionGroupaddAction() 함수를 사용하여 그룹에 추가됩니다. 그룹을 부모로 하여 액션을 만들어 그룹에 추가할 수도 있습니다. 액션 그룹은 기본적으로 배타적이므로 그룹에 있는 액션 중 한 번에 하나만 확인됩니다( 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);

QMenuBaraddMenu() 함수는 지정된 제목을 가진 새 QMenu 을 메뉴 모음에 추가합니다(메뉴 모음은 메뉴의 소유권을 가짐에 유의하세요). QWidgetaddAction() 함수를 사용하여 각 액션을 해당 메뉴에 추가합니다.

또는 QMenu 클래스는 주어진 텍스트 및/또는 아이콘에서 새 액션을 생성하고 추가하는 여러 가지 addAction() 편의 함수를 제공합니다. 새 액션의 triggered() 신호에 자동으로 연결되는 멤버와 QKeySequence 인스턴스로 표시되는 바로 가기를 제공할 수도 있습니다.

QMenu::addSeparator() 함수는 새 구분 기호 액션, 즉 QAction::isSeparator()이 참을 반환하는 액션을 생성하여 반환하고 메뉴의 액션 목록에 새 액션을 추가합니다.

    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 메뉴에 주목하세요. 우선 QMenuaddMenu() 함수를 사용하여 Edit 메뉴에 하위 메뉴로 추가됩니다. 둘째, 정렬 액션을 살펴보세요: createActions() 함수에서 leftAlignAct, rightAlignAct, justifyActcenterAct 액션을 액션 그룹에 추가했습니다. 하지만 액션 그룹이 백그라운드에서 마법을 부리는 동안 각 액션을 메뉴에 개별적으로 추가해야 합니다.

#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

사용자 정의 컨텍스트 메뉴를 제공하려면 QWidgetcontextMenuEvent() 함수를 다시 구현하여 위젯의 컨텍스트 메뉴 이벤트를 수신해야 합니다(기본 구현은 이러한 이벤트를 단순히 무시합니다).

이러한 이벤트를 수신할 때마다 Cut, CopyPaste 액션이 포함된 메뉴를 만듭니다. 컨텍스트 메뉴는 popup() 함수를 사용하여 비동기적으로 실행하거나 exec() 함수를 사용하여 동기적으로 실행할 수 있습니다. 이 예제에서는 exec() 함수를 사용하여 메뉴를 표시하도록 선택했습니다. 이벤트의 위치를 인수로 전달하면 컨텍스트 메뉴가 예상 위치에 표시되도록 할 수 있습니다.

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

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