티스토리 뷰
다양한 대화창을 만드는 기반 클래스이다. 현재의 대화창이 다른 창 보다 입력 우선순위를 갖는 모달(Modal) 방식의 대화창과 다른 창과 독립적으로 운용되는 모달리스(Modeless, Non-Modal) 방식의 대화창을 만들 수 있다. 사용자 대화창도 이 클래스를 상속받아 만들 수 있지만 QColorDialog, QErrorMessage, QFileDialog, QFontDialog, QInputDialog, QMessageBox, QProgressDialog 등의 클래스들도 QDialog 클래스를 상속한다. QDialog 클래스는 QWidget 클래스를 상속받는다.
참조 링크 : https://doc.qt.io/qt-5/qdialog.html
int exec() : 대화창을 모달 방식으로 열고 대화창을 닫으며 결과를 리턴한다.
QDialog::Accepted = 1, QDialog::Rejected = 0, ESC를 누르면 Rejected 리턴
void show() : 대화창을 모달리스 방식으로 연다.
InputDlg::InputDlg(QWidget * parent, const QIcon & icon, const QString & mess, const QString & ndlg, bool with_id, bool with_nm,
const string & lang, const string & istCtxId):
QDialog(parent), mId(NULL), mName(NULL), stCtxId(istCtxId) {
setWindowModality(Qt::WindowModal);
setWindowTitle(ndlg);
setWindowIcon(icon);
QVBoxLayout * dlg_lay = new QVBoxLayout(this);
dlg_lay->setMargin(10);
dlg_lay->setSpacing(6);
QHBoxLayout * intr_lay = new QHBoxLayout;
intr_lay->setSpacing(6);
QLabel * icon_lab = new QLabel(this);
icon_lab->setSizePolicy(QSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum));
icon_lab->setPixmap(icon.pixmap(48));
intr_lay->addWidget(icon_lab);
inpLab = new QLabel(mess, this);
inpLab->setWordWrap(true);
intr_lay->addWidget(inpLab);
dlg_lay->addItem(intr_lay);
mEdLay = new QGridLayout;
mEdLay->setSpacing(6);
if (with_id) {
mEdLay->addWidget(new QLabel(_("Identifier:"), this), 0, 0);
mId = new QLineEdit(this);
mEdLay->addWidget(mId, 0, 1);
}
if (with_nm) {
mEdLay->addWidget(new QLabel(_("Name:"), this), 1, 0);
mName = new QLineEdit(this);
mEdLay->addWidget(mName, 1, 1);
}
mEdLay->addItem(new QSpacerItem(10, 0, QSizePolicy::Minimum, QSizePolicy::Expanding), 100, 0, 1, -1);
dlg_lay->addItem(mEdLay);
QFrame * sep = new QFrame(this);
sep->setFrameShape(QFrame::HLine);
sep->setFrameShadow(QFrame::Raised);
dlg_lay->addWidget(sep);
QDialogButtonBox * but_box = new QDialogButtonBox(QDialogButtonBox::Ok |
QDialogButtonBox::Cancel, Qt::Horizontal, this);
QImage ico_t;
but_box->button(QDialogButtonBox::Ok)->setText(_("Ok"));
if (!ico_t.load(TUIS::icoGet("button_ok", NULL, true).c_str()))
ico_t.load(":/images/button_ok.png");
but_box->button(QDialogButtonBox::Ok)->setIcon(QPixmap::fromImage(ico_t));
connect(but_box, SIGNAL(accepted()), this, SLOT(accept()));
but_box->button(QDialogButtonBox::Cancel)->setText(_("Cancel"));
if (!ico_t.load(TUIS::icoGet("button_cancel", NULL, true).c_str()))
ico_t.load(":/images/button_cancel.png");
but_box->button(QDialogButtonBox::Cancel)->setIcon(QPixmap::fromImage(ico_t));
connect(but_box, SIGNAL(rejected()), this, SLOT(reject()));
dlg_lay->addWidget(but_box);
if (parentWidget()->property("oscdUser").toString().size() && stCtxId.size()) {
int off = 0;
string rst = mod->uiPropGet("InDlgSt" + stCtxId, parentWidget()->property("oscdUser").toString().toStdString());
int wH = s2i(TSYS::strParse(rst, 0, ":", & off)),
wW = s2i(TSYS::strParse(rst, 0, ":", & off));
if (wH > 100 && wW > 100)
resize(wH, wW);
else
resize(400, 120 + (40 * with_nm) + (40 * with_id));
}
}
위의 코드는 QDialog 클래스를 상속받아 사용자 대화창을 만드는 예제로 모달 대화창을 열어서 사용자의 버튼 선택에 따라 accept()와 reject() 내장 메서드를 호출하는 것을 확인할 수 있다. 창을 닫고 QDialog::Accepted 또는 QDialog::Rejected 결과를 리턴한다.
■ 연관 메서드
void setResult(int i)
int result() : 모달 대화창의 결과 설정 및 조회. 되도록 accept() reject()로 결과를 리턴하는 것이 좋다.
bool isModal()
void setModal(bool modal) : 모달 여부 설정 및 조회. show()에만 의미가 있고 exec()를 사용하면 무조건 모달로 연다.
'C | C++' 카테고리의 다른 글
QLineEdit 클래스(QT C++) (0) | 2024.02.21 |
---|---|
QT 디자이너로 QDialog 클래스 만들기 (0) | 2024.02.21 |
QSyntaxHighlighter 클래스(QT C++) (0) | 2024.02.15 |
다형성(Polymorphism)의 구현, 오버로딩과 오버라이딩 (0) | 2024.02.14 |
QList 클래스(QT C++) (0) | 2024.02.13 |