[Qt, C++] 새 창을 띄우는 다이얼로그(Dialog) (Modal, Modeless)

목적

Qt Creator를 활용, 프로젝트를 실행 시 다이얼로그를 호출한다.

모달(Modal)과 모달리스(Modeless)

다이얼로그는 모달과 모달리스 두 종류가 있다. 모달은 다이얼로그가 종료될 때까지 메인 윈도우 창을 제어할 수 없다. 반면 모달리스는 다이얼로그가 실행 중에도 메인 윈도우 창을 제어할 수 있다.

테스트 환경

Windows10 / C++ / Qt 5.15.2 / Qt Creator 4.13.3

모달방식의 다이얼로그 실행

다이얼로그 생성

프로젝트를 우클릭 후 Add New를 클릭한다.

Qt->Qt Designer Form Class를 선택한다.

원하는 다이얼로그를 선택한다.

클래스 이름을 지정한다. 가능하면 아래 예제를 활용할 수 있도록 Dialog로 지정하기를 권장한다.

현재 프로젝트에 추가한다.

mainwindow.h

아래와 같이 코드를 수정한다.

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "dialog.h" // 추가

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::MainWindow *ui;
    Dialog *dialog; // 추가
};
#endif // MAINWINDOW_H

mainwindow.cpp

mainwindow.cpp를 아래와 같이 수정한다.

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    dialog = new Dialog ;
    dialog->setModal(true); // 추가
    dialog->exec(); // 추가
}

MainWindow::~MainWindow()
{
    delete ui;
}

모달방식이기 때문에 프로젝트를 실행하면 다이얼로그 창이 곧바로 뜨고 창을 닫아야 메인 윈도우가 뜬다.

모달리스 방식의 다이얼로그 실행

다이얼로그 생성

모달방식의 다이얼로그 생성과 똑같이 수행한다.

mainwindow.h

아래와 같이 코드를 수정한다. 모달방식과 같은 코드다.

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "dialog.h" // 추가

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::MainWindow *ui;
    Dialog *dialog; // 추가
};
#endif // MAINWINDOW_H

mainwindow.cpp

아래와 같이 코드를 수정한다.

모달과 다른 점은 setModal()을 사용하지 않는다는것과 exec()가 show()로 바뀐 것 뿐이다.

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    dialog = new Dialog; // 추가
    dialog->show(); // 추가
}

MainWindow::~MainWindow()
{
    delete ui;
}

모달리스 방식이기 때문에 메인윈도우 창과 다이얼로그 창이 같이 실행되며 두 창 모두 제어할 수 있다.

Leave a Comment