Qt프로그램

다이얼로그

Barbarian developer 2024. 10. 8.

다이얼로그는 어플리케이션이 동작 중에 이벤트가 발생했을 때 사용자에게 메시지를 전달하기 위한 목적으로 사용된다. 그리고 사용자로부터 입력 값을 받거나 여러 개 중 하나를 선택할 수 있는 GUI를 제공한다. 

종류 설명
QInputDialog 사용자로부터 값을 입력 받을 수 있는 다이얼로그
QColorDialog 특정 컬러를 선택할 수 있는 다이얼로그
QfileDialog 파일 또는 디렉토리를 선택하는 GUI 인터페이스를 제공
QFontDialog 폰트를 선택하기 위한 다이얼로그
QProgressDialog 퍼센트와 같은 진행사항을 보여주기 위한 다이얼로그
QMessageBox 모달 방식의 다이얼로그

QInputDialog

QInputDialog 클래스는 사용자로부터 값을 입력 받을 수 있다.

getInt( ) 멤버 함수

QInputDialog 클래스의 getInt( ) 멤버 함수는 사용자로부터 정수 값을 입력 받을 수 있는 다이얼로그를 제공한다.

bool retValue;
int i = QInputDialog::getInt(this, "정수입력", "퍼센트:",
25, 0, 100, 1, &retValue);
if (retValue)
qDebug("true %d", i);

getDouble( ) 멤버 함수

QInputDialog 클래스의 getDouble( ) 멤버 함수는 실수 값을 입력 받을 수 있다.

bool retValue;
double dVal = QInputDialog::getDouble(this, "실수 입력", "값 입력:",
48.56, -100, 100, 2, &retValue);

 

getItem( ) 멤버 함수

QStringList items;
items << "봄" << "여름" << "가을" << "겨울";
bool ok;
QString item = QInputDialog::getItem(this, "항목선택", "계절 선택: ",
items, 0, false, &ok);

사용 예시

<widget.h>

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QInputDialog> //다이얼 선언

QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

private:
    Ui::Widget *ui;

private slots:  //연결 할 슬롯 선언
    void show_Dialog();
};
#endif // WIDGET_H

 

<widget.cpp>

#include "widget.h"
#include "./ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(ui->button,&QPushButton::clicked, this, &Widget::show_Dialog);
}

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

void Widget::show_Dialog()
{
    // QStringList에 계절 항목 추가
    QStringList items;
    items << "봄" << "여름" << "가을" << "겨울";

    bool ok;
    // QInputDialog를 통해 사용자에게 선택창을 표시
    QString item = QInputDialog::getItem(this, "항목 선택", "계절 선택: ", items, 0, false, &ok);

    if (ok && !item.isEmpty()) {
        // 사용자가 선택을 했을 때, 선택된 항목을 출력 또는 처리
        qDebug() << "선택된 계절:" << item;
    } else {
        // 사용자가 취소했거나 항목을 선택하지 않았을 때
        qDebug() << "선택이 취소되었습니다.";
    }
}

 

더보기

 

세부 설명:

  1. ok:
    • 이 변수는 사용자가 다이얼로그에서 OK 버튼을 눌렀는지 여부를 나타냅니다. 만약 사용자가 OK 버튼을 눌렀다면 ok는 true가 됩니다. 그렇지 않으면 false입니다.
  2. !item.isEmpty():
    • **item.isEmpty()**는 item이 빈 문자열인지 확인하는 함수입니다.
    • 이 값이 true라면, item이 비어 있다는 뜻이고, false라면 item이 비어 있지 않다는 뜻입니다.
    • **!(NOT 연산자)**는 결과를 반대로 바꿉니다. 즉, !item.isEmpty()는 **item이 비어 있지 않을 때 true**가 됩니다.
  3. ok && !item.isEmpty():
    • 이 구문은 두 조건이 모두 참일 때만 true가 됩니다:
      • 사용자가 OK 버튼을 눌렀고 (ok == true)
      • item이 비어 있지 않을 때 (!item.isEmpty() == true)
      • 더 쉽게 작성된 코드:
// 사용자가 OK 버튼을 눌렀는지 확인
if (ok) {
    // 사용자가 선택한 값이 비어 있지 않은지 확인
    if (!item.isEmpty()) {
        qDebug() << "선택된 계절:" << item;  // 선택된 항목 출력
    } else {
        qDebug() << "선택된 항목이 없습니다.";  // 항목이 비어 있을 때
    }
} else {
    qDebug() << "선택이 취소되었습니다.";  // 사용자가 취소 버튼을 눌렀을 때
}

차이점:

  1. 조건을 한 줄로 쓰기보다는, 단계별로 나누어서 처리했습니다.
  2. 각 조건에 대해 별도로 설명을 덧붙여서 논리 흐름이 명확해졌습니다.
  3. 초보자도 쉽게 이해할 수 있도록 가독성을 높였습니다.

 

getText( ) 멤버 함수

bool ok;
QString text = QInputDialog::getText(this, "텍스트 입력", "이름: ",
QLineEdit::Normal, "이름 입력", &ok);

 

QColorDialog

QColorDialog 클래스는 사용자가 색상표를 보고 원하는 색상을 선택하기 위한 기능을 제공한다.

QColor color;
color = QColorDialog::getColor(Qt::green, this, "컬러선택", QColorDialog::DontUseNativeDialog);

if (color.isValid())
qDebug() << Q_FUNC_INFO << "유효한 색상.";

 

QFileDialog

QFileDialog 클래스는 사용자로부터 파일을 선택할 수 있는 다이얼로그를 제공한다. 특정 확장자 또는 특정 파일을 필터링하여 사용자에게 보여줄 수 있다.

 

QFileDialog::Options options;
options = QFileDialog::DontResolveSymlinks | QFileDialog::ShowDirsOnly;
options |= QFileDialog::DontUseNativeDialog;

QString directory = QFileDialog::getExistingDirectory(this,"파일 다이얼로그", "C:", options);
  • getExistingDirectory( ) 멤버 함수는 사용자로부터 디렉토리를 선택할 수 있는 기능을 제공한다. 
  • 첫 번째 인자는 부모 클래스, 두 번째 인자는 다이얼로그의 타이틀 바 제목, 세 번째 인자는 지정한 디렉토리가 디폴트로 지정하기 위해 사용하는 인자이다. 
  • 마지막인자는 파일 다이얼로그의 상수 값을 이용해 필터링하기 위한 옵션이다.
상수 설명
QFileDialog::ShowDirsOnly 디렉토리만 표시
QFileDialog::DontResolveSymlinks 심볼릭 링크를 표시히지 않기 위해 사용
QFileDialog::DontConfirmOverwrite 덮어쓰기 할 때 경고 메시지를 표시하지 않기
QFileDialog::DontUseNativeDialog 시스템 기본 파일 다이얼로그를 사용하지 않기 위해 사용
QFileDialog::ReadOnly 읽기 모드로 파일 다이얼로그를 사용
QFileDialog::HideNameFilterDetails 필터를 이용해 파일을 감추기 위해 사용

QFontDialog

  • QFontDialog는 사용자로부터 폰트를 선택할 수 있는 다이얼로그를 제공한다.
  • 첫 번째인자는 사용자가 다이얼로그 하단에 위치해 있는 [OK] 버튼과 [CANCEL] 버튼 중 어떤 버튼을 클릭했는지 확인하기 위한 변수를 지정 한다.
  • 두 번째 인자는 폰트 다이얼로그 상에서 디폴트 선택으로 지정할 수 있는 폰트를 지정한다.
bool ok;
QFont font;
font = QFontDialog::getFont(&ok, QFont( "Courier 10 Pitch" ), this);

QProgressDialog

QProgressDialog 클래스는 사용자에게 현재 진행 사항을 보여주기 위한 목적으로 사용한다.

<widget.h>

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QProgressDialog>
#include <QTimer>

namespace Ui { class Widget; }

class Widget : public QWidget
{
	Q_OBJECT
public:
	explicit Widget(QWidget *parent = nullptr);
	~Widget();
private:
    Ui::Widget *ui;
    QProgressDialog *pd;
    QTimer *timer;
    int steps;
public slots:
    void perform();
    void cancel();
    };
#endif // WIDGET_H

 

<widget.cpp>

 

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget)
{
    ui->setupUi(this);
    steps = 0;
    pd = new QProgressDialog("파일 복사 진행사항", "취소", 0, 100);
    connect(pd, SIGNAL(canceled()), this, SLOT(cancel()));
    timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(perform()));
    timer->start(1000);
}
Widget::~Widget()
{
	delete ui;
}
void Widget::perform()
{
    pd->setValue(steps);
    steps++;
    
    if (steps > pd->maximum())
    timer->stop();
}

void Widget::cancel()
{
	timer->stop();
}

 

QMessageBox

상수 설명
QMessageBox::Ok 0x00000400 OK 버튼
QMessageBox::Open 0x00002000 파일 열기 버튼
QMessageBox::Save 0x00000800 저장 버튼
QMessageBox::Cancel 0x00400000 취소 버튼
QMessageBox::Close 0x00200000 닫기 버튼
QMessageBox::Discard 0x00800000 저장하지 않고 버리기 버튼
QMessageBox::Apply 0x02000000 APPLY 버튼
QMessageBox::Reset 0x04000000 RESET 버튼
QMessageBox::RestoreDefaults 0x08000000 다시 저장하기 버튼
상수 설명
QMessageBox::Help 0x01000000 도움말 버튼
QMessageBox::SaveAll 0x00001000 모두 저장하기 버튼
QMessageBox::Yes 0x00004000 YES 버튼
QMessageBox::YesToAll 0x00008000 모두 YES 적용하기 버튼
QMessageBox::No 0x00010000 NO 버튼
QMessageBox::NoToAll 0x00020000 모두 NO 적용하기 버튼
QMessageBox::Abort 0x00040000 중지 버튼
QMessageBox::Retry 0x00080000 재시도 버튼
QMessageBox::Ignore 0x00100000 Ignore(무시) 버튼
QMessageBox::NoButton 0x00000000 An invalid button

 

QMessageBox 클래스를 이용해 [Abort] 버튼, [Retry] 버튼, [Ignore] 버튼을사용하기 위한 예제이다.

 

11장에서 풀어보라 하는 사용자 설정 예제는 시간이 나면 해결해보도록 하고, 일단 넘어가겠다.

 

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

Container Classes  (1) 2024.10.08
QMainWindow 를 이용한 GUI 구현  (1) 2024.10.08
Qt Designer 를 이용한 GUI 설계  (3) 2024.10.08
Signal and Slot  (1) 2024.10.08
Layout  (0) 2024.10.08

댓글