1. 程式人生 > >學習筆記之Qt自定義對話方塊

學習筆記之Qt自定義對話方塊

1、用qt creator 建立一個名為mydialog的qt empty project工程;
2、在該工程中新增logindlg.cpp、logindlg.h、mydialog.cpp檔案,程式碼如下:

logindlg.h

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

#include<QtGui/QDialog>
#include<QtGui/QLabel>
#include<QtGui/QPushButton>
#include<QtGui/QGridLayout>
#include<QtGui/QHBoxLayout>
#include<QtGui/QVBoxLayout>

class QLineEdit;
class CLoginDlg:public QDialog
{
    Q_OBJECT
public:
    //建構函式,表示自定義的對話方塊沒有父視窗部件
    CLoginDlg(QWidget *parent=0);
public slots:
    virtual void accept();
private:
    QLabel *usrLabel;
    QLabel *pwdLabel;

    QLineEdit* usrLineEdit;
    QLineEdit* pwdLineEdit;

    QPushButton *okBtn;
    QPushButton *cancelBtn;

    QHBoxLayout *btnLayout;
    QGridLayout *gridLayout;
    QVBoxLayout *dlgLayout;
};

#endif // LOGINDLG_H
注:
      程式碼“class QLineEdit”是類QLineEdit的傳遞宣告,因為在類CLoginDlg的標頭檔案中僅僅使用了指向QLineEdit物件的指標,因此在編譯標頭檔案時,編譯器不需要知QLineEdit
類的定義。該程式碼的作用是告訴編譯器,QLineEdit類已經存在。
      這樣做可以減小標頭檔案的大小,增加編譯速度(特別是當該標頭檔案被其他檔案多次包含引用時);這樣做還可以避免因包含標頭檔案的順序不當而造成連線錯誤,特別是在大的工程當中更應該避免隨意地在一個頭檔案中包含另一個頭檔案。


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

CLoginDlg::CLoginDlg(QWidget* parent):QDialog(parent)
{
    usrLabel=new QLabel(tr("使用者名稱:"));
    pwdLabel=new QLabel(tr("密 碼:"));
    usrLineEdit=new QLineEdit;
    pwdLineEdit=new QLineEdit;
    //設定密碼編輯框物件pwdLineEdit的內容顯示方式為採用星號“*”代替使用者輸入的字元
    pwdLineEdit->setEchoMode(QLineEdit::Password);

    //建立一個網格佈局管理器物件,並將視窗部件新增到該佈局管理器中
    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);

    //建立兩個按鈕物件和一個水平佈局管理器物件,並將按鈕物件新增到該佈局管理器中
    okBtn=new QPushButton(tr("確定"));
    cancelBtn=new QPushButton(tr("取消"));
    btnLayout=new QHBoxLayout;
    btnLayout->setSpacing(60);
    btnLayout->addWidget(okBtn);
    btnLayout->addWidget(cancelBtn);

    //建立一個垂直佈局管理器物件,並將水平和網格佈局管理器新增到該管理器中
    dlgLayout=new QVBoxLayout;
    dlgLayout->setMargin(40);
    dlgLayout->addLayout(gridLayout);
    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 CLoginDlg::accept()
{
    if(usrLineEdit->text().trimmed()==tr("lcf")&&
            pwdLineEdit->text()==tr("lcf"))
    {
        QDialog::accept();
    }
    else
        QMessageBox::warning(this,tr("警告"),
                             tr("使用者或密碼錯誤!"),
                             QMessageBox::Yes);
    usrLineEdit->setFocus();
}
注:
1、通常行編輯框QLineEdit視窗部件的顯示方式有下列幾種方式:
1.1 QLineEdit::Normal,預設的顯示方式,顯示使用者實際輸入的內容;
1.2 QLineEdit::Password,用星號“*”代替使用者實際輸入的內容;
1.3 QLineEdit::NoEcho,不顯示使用者輸入的任何內容;
1.4 QLineEdit::PasswordEchoOnEdit,僅僅在使用者在行編輯框裡編輯文字的內容時顯示使用者輸入的字元,一旦使用者完成編輯則以星號“*”代替輸入的內容;

2、函式QGridLayout::addWidget()將先前生成的標籤和行編輯框新增到網格佈局管理器中。在上面的程式碼中,gridLayout->addWidget(usrLineEdit,0,1,1,3)函式共有5個引數,第一個引數指出將新增哪一個部件到該佈局管理器中,後4個引數確定該部件在網格佈局管理器中的具體位置,前兩個表示行、列號,後兩個分別表示行的跨度和列的跨度。

3、函式QHBoxLayout::setSpacing()設定水平佈局管理器btnLayout物件內部視窗部件之間的間隔為60。

4、函式QVBoxLayout::setMargin()設定佈局管理器dlgLayout邊框的寬度為40,即其內部子視窗部件距離佈局管理器邊界(佈局管理器的邊界不可見)的距離為40。

5、函式 QVBoxLayout::addStretch()在垂直佈局管理器dlgLayout物件中加入一個大小為40的stretch,這將使得佈局管理器gridLayout和btnLayout之間的預設距離設定為40,當同時上下拉伸對話方塊的高度時,該stretch可以自由伸縮,從而保證girdLayout和btnLayout管理器內部各視窗部件的高度以及彼此間的垂直距離保持不變。

6、QMessageBox類提供了顯示操作資訊的幾種模態對話方塊:
6.1 QMessageBox::about,一個僅僅帶有標題和簡單文字的訊息框;
6.2 QMessageBox::aboutQt,顯示關於Qt的訊息框;
6.3 QMessageBox::information,一個具有主題和提示文字的提示訊息框;
6.4 QMessageBox::question,一個具有標題和文字資訊的詢問訊息框;
6.5 QMessageBox::warning,一個具有標題和文字資訊的警告訊息框;
6.6 QMessageBox::critical,一個具有標題和文字資訊的致命錯誤訊息框;

mydialog.cpp

#include<QtGui/QtGui>
#include"logindlg.h"
int main(int argc,char *argv[])
{
    QApplication app(argc,argv);
    QTextCodec::setCodecForTr(QTextCodec::codecForName("gb18030"));
    CLoginDlg dlg;
    return dlg.exec();

}
注:對話方塊分為兩種型別:模態對話方塊和非模態對話方塊;
   模態對話方塊型別是最普遍的對話方塊型別,他在沒有消失之前使用者不能與同一個應用程式的其他視窗進行互動,直到該對話方塊關閉。
   非模態對話方塊被開啟後,使用者既可以選擇與該對話方塊進行互動,也可以選擇與應用程式的其他視窗進行互動。
   非模態對話方塊若是棧物件,當代碼退出對話方塊物件的作用域後,該對話方塊就自動銷燬了,這就造成使用者來不及和對話方塊進行互動,對話方塊就消失了。因此,必須通過new操作在堆中建立非模態對話方塊。
   在Qt中,QDialog::exec()以模態方式顯示對話方塊,而QDialog::show()預設以非模態方式顯示對話方塊。