티스토리 뷰

C | C++

QDialog 클래스(QT C++)

야라바 2024. 2. 20. 21:54
728x90

다양한 대화창을 만드는 기반 클래스이다. 현재의 대화창이 다른 창 보다 입력 우선순위를 갖는 모달(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()를 사용하면 무조건 모달로 연다.

 

728x90