對話方塊 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"));