1. 程式人生 > >對話方塊 QDialog

對話方塊 QDialog

QDialog的父類及其若干子類


QAbstractPrintDialog     提供印表機配置對話方塊的基本實現對話方塊
QColorDialog                  提供指定窗體顏色的對話方塊
QErrorMessage              提供“錯誤提示”對話方塊
QFileDialog                     提供選擇檔案或目錄的對話方塊
QFontDialog                    提供指定窗體的文字字型對話方塊
QInputDialog                   提供標準輸入對話方塊,可以方便的輸入各種值
QMessageBox                提供一個模態對話方塊用於提示使用者資訊或要求使用者回答問題
QPageSetupDialog        提供一個用於印表機頁面設定的對話方塊
QPrintPreviewDialog     提供一個預覽和調整印表機頁面佈局的對話方塊
QProgressDialog            提供一個長程序操作的進度回饋對話方塊
QWizard                            提供一個“嚮導程式”的框架

建立一個QDialog工程(編譯器:Qt Creater)

新建一個工程:

    開啟編譯器,點選“檔案”,選擇“新建檔案或工程” 出現下面的圖,並按紅色標記處選擇

填寫專案名稱、選擇路徑,完成後點選“下一步”

預設選項

填寫類名,特別注意的是,因為我們這兒建立的是一個QDialog,所以,基類名一定要選擇QDialog

工程建立完成,下面就是完整的原始碼

/* logindlg.h */

#ifndef LOGINDLG_H
#define LOGINDLG_H
// 定義巨集變數,確保該標頭檔案只被包含一次,防止標頭檔案多次包含

#include <QDialog>
/*
 * 在編譯標頭檔案時,gcc不需要知道QLineEdit類的定義,故不需要包含標頭檔案,僅僅一個宣告就行。
 * 這樣做的好處由兩個:
 * 首先,它減小了標頭檔案的大小,增加編譯的速度
 * 其次,避免了包含標頭檔案的順序不當造成連結錯誤
 */
class QLineEdit;

namespace Ui {
  class LoginDlg;
}

class LoginDlg : public QDialog
{
  // 啟動Qt元物件系統的一些特性(比如支援訊號和槽等),它必須放置到類定義的私有區
  Q_OBJECT
 
public:
  // 建構函式,它指定了一個預設值為NULL的指向QWidget的引數
  // 該行參定義了對話方塊物件的父視窗部件,預設NULL意味著自定義的對話方塊沒有父視窗部件
  explicit LoginDlg(QWidget *parent = 0);
  ~LoginDlg();

public slots:
  // 虛擬函式,能重寫
    virtual void accept();
 
private:
  Ui::LoginDlg *ui;
  QLineEdit *usrLineEdit;  // 存放、顯示輸入使用者名稱
  QLineEdit *pwdLineEdit;  // 存放、顯示使用者輸入的密碼
};

#endif // LOGINDLG_H

---------------------------------------------分隔符------------------------------------------------------------------

/* logindlg.cpp */

#include <QtGui/QtGui>
#include "logindlg.h"
#include "ui_logindlg.h"

// 呼叫LoginDlg的父類的建構函式QDialog,並將實參傳遞給了父類的建構函式,以設定對話方塊的父部件
LoginDlg::LoginDlg(QWidget *parent) :
  QDialog(parent),
  ui(new Ui::LoginDlg)
{
  ui->setupUi(this);
  // QLabel標籤
  QLabel *usrLabel = new QLabel(tr("使用者名稱:"));
  QLabel *pwdLabel = new QLabel(tr("密   碼:"));
  // QLineEdit行編輯框
  usrLineEdit = new QLineEdit;
  pwdLineEdit = new QLineEdit;
  /*
   * QLineEdit::Password設定了行編輯框中顯示資訊的方式為“*”,還有其它方式如下:
   * QLineEdit::Normal,預設的顯示方式,顯示使用者實際的輸入內容
   * QLineEdit::Pasword,用“*”代替使用者實際輸入的內容
   * QLineEdit::NoEcho,不顯示使用者輸入的任何資訊
   * QLineEdit::PasswordEchoOnEdit,僅僅使用者在行編輯框裡編輯就文字的內容時才顯示內容,完成後用“*”代替
   */
  pwdLineEdit->setEchoMode(QLineEdit::Password);

  QGridLayout *gridLayout  = new QGridLayout;
  // 前面兩個表示了行和列的位置,後面兩個引數表示了行和列的跨度
  gridLayout->addWidget(usrLabel, 0, 0, 1, 1);
  gridLayout->addWidget(usrLineEdit, 0, 1, 1, 3);
  gridLayout->addWidget(pwdLabel, 1, 0, 1, 1);
  gridLayout->addWidget(pwdLineEdit, 1, 1, 1, 3);

  QPushButton *okBtn = new QPushButton(tr("確定"));
  QPushButton *cancelBtn = new QPushButton(tr("取消"));
  // 水平佈局,預設將下面兩個按鈕按從左向右的順序排布
  QHBoxLayout *btnLayout = new QHBoxLayout;
  // btnLayout物件內部視窗之間的間隔是60
  btnLayout->setSpacing(60);
  btnLayout->addWidget(okBtn);
  btnLayout->addWidget(cancelBtn);

  // 垂直佈局
  QVBoxLayout *dlgLayout = new QVBoxLayout;
  // 設定邊框的寬度是40
  dlgLayout->setMargin(40);
  dlgLayout->addLayout(gridLayout);
  // 使gridLayout和btnLayout之間的預設距離設定成40,同時當上下拉伸對話方塊的高度時,
  // 該stretch可以自由伸縮,從而保證gridLayout和btnLayout管理內部各視窗部件的高度
  // 以及彼此間的距離不變
  dlgLayout->addStretch(40);
  dlgLayout->addLayout(btnLayout);
  setLayout(dlgLayout);

  connect(okBtn, SIGNAL(clicked()), this, SLOT(accept()));
  connect(cancelBtn, SIGNAL(clicked()), this, SLOT(reject()));

  // 設定對話方塊的標題
  setWindowTitle(tr("登入"));
  resize(300, 200);
}

void LoginDlg::accept()
{
  // QLineEdit::text()返回行編輯框中的文字內容,返回型別是一個QString型別
  // QString.trimmed()移除在字串開頭和結尾的空白字串,並返回移除空白字元後的字串
  if(usrLineEdit->text().trimmed() == tr("lcf")
     && pwdLineEdit->text() == tr("lcf"))
    {
     QDialog::accept();
    }
  else
    {
      // 建立並顯示一個模態的警告對話方塊
      QMessageBox::warning(this,
                           tr("警告"),
                           tr("使用者名稱或密碼錯誤!"),
                           QMessageBox::Yes);
      // 將滑鼠的焦點定位到行編輯框物件usrLineEdit
      usrLineEdit->setFocus();
    }
}


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

---------------------------------------------分隔符------------------------------------------------------------------

/* main.cpp */

#include <QtGui/QtGui>
#include "logindlg.h"

int main(int argc, char *argv[])
{
  QApplication a(argc, argv);
  // 設定中文顯示
  QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
  LoginDlg dlg;
 
  /*
   * 對話方塊分為了模態對話方塊和非模態對話方塊
   * 模態對話方塊,QDialog::exec(),對話方塊沒有消失之前,使用者不能和同一程序的其它視窗進行互動,直到對話方塊關閉
   * 非模態對話方塊,QDialog::show(),預設方式,使用者可以和同一程序中的其它視窗互動。
   */
  //dlg.show();
  return dlg.exec();
}

執行結果:


我用的ubuntu12.04在除錯的過程中,遇到的就是問題就是“中文不能顯示”

後來看了這篇文章  http://blog.csdn.net/lincyang/article/details/5758287,經過修改,除錯成功

具體的步驟:

1、開啟終端,輸入echo $LANG

      zh_CN.UTF-8

2、在main.cpp中新增語句

      QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));