이번에는 상단 메뉴바를 생성하는 예제 입니다.


main.cpp

#include 
#include <qtextcodec>
#include "mainwindow.h"

int main(int argc, char **argv)
{
    QApplication app(argc, argv);

    QTextCodec::setCodecForTr(QTextCodec::codecForName("eucKR"));

    MainWindow *mainWindow = new MainWindow();
    mainWindow->setFixedSize(500, 400);
    mainWindow->show();

    return app.exec();
}

한글 출력을 위해 코덱을 설정해 주었으며 mainwindow를 사용자가 창을 조절하지 못하도록 생성하였습니다.



mainwindow.h


#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <qmainwindow>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow();

private:

private slots:
    // 파일
    void Main_SlotNewFile();

    // 테스트
    void Main_SlotTest1();
    void Main_SlotTest2();
    void Main_SlotTest3();
};
#endif // MAINWINDOW_H
mainwindow의 헤더파일 입니다.

QMainWindow를 상속받고 있습니다.


마지막 부분을보면 slots이라는 키워드가 있습니다.

이 슬롯은 다음에 설명하기로 하겠습니다.



mainwindow.c 소스 파일로 넘어갑니다.


#include <QMenuBar>
#include <QStatusBar>
#include <QAction>
#include "mainwindow.h"

MainWindow::MainWindow()
{
    QMenu *pFileMenu;
    QStatusBar *pStartusbar;

    // 파일
    QAction *pSlotNewFile = new QAction(tr("새 파일"), this);
    pSlotNewFile->setShortcut(tr("Ctrl+N"));
    pSlotNewFile->setStatusTip(tr("새 파일을 생성합니다."));
    connect(pSlotNewFile, SIGNAL(triggered()), this, SLOT(Main_SlotNewFile()));

    pFileMenu = menuBar()->addMenu(tr("파일"));
    pFileMenu->addAction(pSlotNewFile);

    // 테스트
    QAction *pSlotTest1 = new QAction(tr("테스트 1"), this);
    pSlotTest1->setShortcut(tr("Ctrl+T"));
    pSlotTest1->setStatusTip(tr("1번 메뉴 테스트"));
    connect(pSlotTest1, SIGNAL(triggered()), this, SLOT(Main_SlotTest1()));

    QAction *pSlotTest2 = new QAction(tr("테스트 2"), this);
    pSlotTest2->setStatusTip(tr("2번 메뉴 테스트"));
    connect(pSlotTest2, SIGNAL(triggered()), this, SLOT(Main_SlotTest2()));

    QAction *pSlotTest3 = new QAction(tr("테스트 3"), this);
    pSlotTest3->setStatusTip(tr("3번 메뉴 테스트"));
    connect(pSlotTest3, SIGNAL(triggered()), this, SLOT(Main_SlotTest3()));

    pFileMenu = menuBar()->addMenu(tr("테스트"));
    pFileMenu->addAction(pSlotTest1);
    pFileMenu->addAction(pSlotTest2);
    pFileMenu->addAction(pSlotTest3);

    // 상태바 연결
    pStartusbar = statusBar();
}

void MainWindow::Main_SlotNewFile()
{

}

// 이미지
void MainWindow::Main_SlotTest1()
{

}
void MainWindow::Main_SlotTest2()
{

}
void MainWindow::Main_SlotTest3()
{

}

메뉴바 생성을위한 몇가지 헤더파일이 추가되어있습니다.

08 ~ 09. 라인에서 QMenu와 QStatusBar를 선언하였습니다. QMenu는 만들고자 하는 메뉴바, QStatusBar는 화면 하단 상태바 입니다. 
12. 라인에서 QAction을 생성하고 있습니다. QAction은 큰 메뉴안에 들어가는 작은 메뉴입니다.
13. 라인에서는 단축키를 지정해주고 있습니다. Ctrl+N을 누르면 '새 파일'이 실행되겠지요.
14. 라인에서는 상태바에 출력될 팁을 작성하고 있습니다. '새 파일'에 마우스를 올려놓으면 하단 상태바에 해당 문구가 출력 됩니다.
15. 라인은 시그널과 슬롯을 연결해 주고 있는데요, 아직 시그널과 슬롯을 다루지 않았으므로 간단하게 설명하겠습니다.

connect(pSlotNewFile, SIGNAL(triggered()), this, SLOT(Main_SlotNewFile()));
pSlotNewFile 이 SIGNAL(triggered())되면 this의 SLOT(Main_SlotNewFile())을 실행시켜라.

시그널과 슬롯의 관계를 알지 못해도 어떠한 방식으로 사용되는지 아실 수 있으실 겁니다.

17 ~ 18. 라인은 상위 메뉴바에 '파일' 이라는 큰 메뉴를 생성하고 지금까지 만든 '새 파일' 액션을 추가시켜 줍니다.

21 ~ 37. '새 파일' 액션을 만든 것 처럼 나머지 메뉴도 생성하여 줍니다.

40. QStatusBar에 상태바를 연결하여 줍니다.


빌드 후 실행해보면 아래와같은 프로그램이 실행이 됩니다.





위 스크린샷을 보시면 지금까지 작업한 것들이 정상적으로 출력되고 있습니다.

1. 파일과 테스트라는 큰 메뉴가 존재하고

2. 생성한 액션만큼 하위 메뉴가 만들어졌으며

3. 단축키를 지정한 액션에 단축키가 등록되어 있습니다.

4. 화면 하단에 상태바도 정상적으로 작동 하는군요.


:)




+ Recent posts