지금까지 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 |
댓글