Qt프로그램

QMainWindow 를 이용한 GUI 구현

Barbarian developer 2024. 10. 8.

지금까지 Qt를 이용한 GUI 기반의 위젯을 윈도우 상에 배치하는 예제를 다루어 보았다. 

지금까지 다룬 방식은 QWidget 을 이용해 한 개의 윈도우 화면만 존재하는 방식으로 GUI를 구성하였다.
하지만 기능이 복잡하고 사용자에게 많은 기능을 제공해야 하는 경우 GUI 구현 시, QWidget 보다는 QMainWindow 를 이용해 GUI를 구현하는 것이 사용자에게 직관적인 GUI를 제공할 수 있을 것이다.

예를 들어 Menu Bar, Toolbars, Status Bar, Dock Widget, Central Widget 등으로 위젯들을 특정 영역에 배치할 수 있다.

그리고 Qt는 MDI(Multi Document Interface) 방식을 구현할 수 있다.


QMdiArea 클래스를 이용한 MDI 기반의 GUI 예제

 

  • 이번 예제에서는 QMdiArea 클래스를 이용해 MDI 기반의 GUI를 구현해 보도록 하자.
  • 이 예제는 Qt를 설치하면 제공되는 예제이다.
  • Examples 의 MDI Example 예제에 전체소스코드 참조하면 된다. 
  • 이 예제 소스코드는 2개의 클래스로 구현되어 있다.
  • MainWindow 클래스는 QMainWindow 클래스를 상속받아 구현 메인 윈도우 GUI 이다.
  • 이 클래스에는 Menu Bar, Tool Bar, Central Widget 영역 등이 구현되어 있다.
  • MDIMainWindow 클래스는 QTextEdit 위젯 클래스를 상속받는 위젯 클래스이다. 
  • 이 클래스는 MainWindow 중앙 배치할 다중 에디트 위젯으로 사용한다. 
  • 즉 울트라 에디터,노트패드 등과 같이 여러 개의 텍스트 파일을 하나의 윈도우 영역 안에서 편집할 수
    있는 기능을 제공하기 위해 구현된 클래스 이다. 
  • 다음 예제 소스코드는 MainWindow클래스의 헤더 소스코드 이다.

<mainwindow.h>

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "MDIMainwindow.h"

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:

private slots:
    void newFile();
    void open();
};

#endif // MAINWINDOW_H
  • newFile( ) Slot 함수는 메뉴 바에서 [New] 메뉴를 클릭했을 때 호출된다.
  • open( ) 함수는[Open] 메뉴를 클릭하면 호출된다. 다음 예제는 mainwindow.cpp 소스코드이다

<mainwindow.cpp>

#include "mainwindow.h"
#include <QMenu>
#include <QAction>
#include <QMenuBar>
#include <QToolBar>
#include <QDockWidget>
#include <QListWidget>
#include <QStatusBar>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    QMenu *fileMenu;
    QAction *newAct;
    QAction *openAct;

    newAct = new QAction(QIcon(":/images/new.png"), tr("&New"), this);
    newAct->setShortcuts(QKeySequence::New);
    newAct->setStatusTip(tr("Create a new file"));
    connect(newAct, SIGNAL(triggered()), this, SLOT(newFile()));

    openAct = new QAction(QIcon(":/images/open.png"), tr("&Open"), this);
    openAct->setShortcuts(QKeySequence::Open);
    openAct->setStatusTip(tr("Open an existing file"));
    connect(openAct, SIGNAL(triggered()), this, SLOT(open()));

    fileMenu = menuBar()->addMenu(tr("&File"));
    fileMenu->addAction(newAct);
    fileMenu->addAction(openAct);

    QToolBar *fileToolBar;
    fileToolBar = addToolBar(tr("File"));
    fileToolBar->addAction(newAct);
    fileToolBar->addAction(openAct);

    QDockWidget *dock = new QDockWidget(tr("Target"), this);
    dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);

    QListWidget *customerList = new QListWidget(dock);
    customerList->addItems(QStringList()
            << "One"
            << "Two"
            << "Three"
            << "Four"
            << "Five");

    dock->setWidget(customerList);
    addDockWidget(Qt::RightDockWidgetArea, dock);

    setCentralWidget(new MDIMainWindow());


    statusBar()->showMessage(tr("Ready"));

}

MainWindow::~MainWindow()
{

}

// [SLOTS]
void MainWindow::newFile()
{
    qDebug() << Q_FUNC_INFO;
}

void MainWindow::open()
{
    qDebug() << Q_FUNC_INFO;
}
  • MainWindow 클래스의 생성자 에서는 MDI 윈도우 GUI상에서 메뉴와 툴바에 배치할메뉴 항목을 정의한다. 
  • 그리고 각 메뉴의 클릭 시 Signal 이벤트 발생시 Slot 함수와 연결한다.
    QDockWidget 은 MDI 윈도우 좌측에 위치하고 사용자가 GUI상에서 새로운 창으로 분리할 수 있는 GUI를 제공한다. 
  • MDIMinWindow 클래스는 MDI 윈도우에서 Child 윈도우로 사용한다. 
  • 즉 GUI 내에 여러 개의 Child 윈도우를 제공하는 것과 같은 기능을 제공한다. 
  • 다음은 MDIMainWindow 클래스의 헤더 소스코드 이다.

<MDIMainwindow.cpp>

#include "MDIMainwindow.h"
#include <QMdiArea>
#include <QMdiSubWindow>
#include <QPushButton>

MDIMainWindow::MDIMainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    setWindowTitle(QString::fromUtf8("My MDI"));

    QMdiArea* area = new QMdiArea();
    area->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);

    // MdiSubWindow 생성
    QMdiSubWindow* subWindow1 = new QMdiSubWindow();
    subWindow1->resize(300, 200);

    QPushButton *btn = new QPushButton(QString("Button"));
    subWindow1->setWidget(btn);


    QMdiSubWindow* subWindow2 = new QMdiSubWindow();
    subWindow2->resize(300, 200);

    // MDIMainWindows에 서브 윈도우 추가
    area->addSubWindow(subWindow1);
    area->addSubWindow(subWindow2);

    setCentralWidget(area);
}
  • 이 클래스 생성자 에서는 QMdiArea 클래스와 QMdiSubWindow 클래스를 이용해 MDIMainWindow 하위에 서브 윈도우로 등록할 윈도우를 생성한다. 
  • 다음 예제 소스코드는 MDIMainwindow.cpp 소스코드 이다.

<main.cpp>

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

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    MainWindow w;
    w.show();

    return a.exec();
}

 

'Qt프로그램' 카테고리의 다른 글

Model and View  (1) 2024.10.09
Container Classes  (1) 2024.10.08
다이얼로그  (0) 2024.10.08
Qt Designer 를 이용한 GUI 설계  (3) 2024.10.08
Signal and Slot  (1) 2024.10.08

댓글