對話框一般用來提供反饋信息或從用戶處獲取輸入,Qt 實現了很豐富的對話框類。
1、首先我們來看看QDialog的類關係
2、模態對話框和非模態對話框
所謂模態對話框就是在其沒有被關閉之前,用戶不能與同一個應用程序的其他窗口進行交互,直到該對話框關閉。對於非模態對話框,當被打開時,用戶既可選擇和該對話框進行交互,也可以選擇同應用程序的其他窗口交互。
在Qt中,Qt的模態與非模態對話框是通過其屬性modal來確定的。我們來看看modal屬性,其定義:
modal:bool
默認情況下,對話框的該屬性是false,這時候通過show()方法顯示的對話框就是非模態對話框。
而使用exec()方法顯示對話框的話,將忽略modal屬性值的設置並把對話框設置爲模態對話框,
一般使用setmodal()方法來設置對話框的modal屬性。
非模態對話框如果是棧對象,當代碼退出對話框對象的作用域後,該對話框就會自動銷燬了,這就造成用戶來不及和對話框進行交互,對話框就消失了。因此,必須通過new操作在堆中創建非模態對話框。
3、代碼解析
loginDlg.h
#ifndef LOGINDLG_H
#define LOGINDLG_H
#include <QDialog>
class QLineEdit;
namespace Ui {
class CloginDlg;
}
class CloginDlg : public QDialog
{
Q_OBJECT
public:
explicit CloginDlg(QWidget *parent = 0);
~CloginDlg();
public slots:
virtual void accept();
private:
Ui::CloginDlg *ui;
QLineEdit *nameEdit;
QLineEdit *pwdEdit;
};
#endif // LOGINDLG_H
第六行 我們聲明瞭QLineEdit,因爲在該頭文件,我們僅僅使用了指向QLineEdit類的指針。
查閱了部分書籍,原段
/*
首先,它減小了頭文件的大小,增加了編譯速度(特別是當頭文件被其他文件多次包含引用時);
其實,這樣做可以避免因爲頭文件的順序不當而造成連接錯誤,特別是在大的工程當中更應該避免隨意地在一個頭文件包含另一個頭文件。
*/
代碼中出現的Ui是因爲我們添加了Qt Designer文件Q_OBJECT
宏的作用是啓動Qt元對象的一些特性(比如支持信號與槽等),它必須放置到類定義的私有區。///????私有區
virtual void accept();
重新聲明瞭QDialog類的虛函數accept()。因爲我們的功能要求點擊ok後還必須驗證賬號與密碼的正確性。
在我學習Qt短短几個星期的體驗中,我們在”畫“界面的時候通常有幾個步驟
1、定義類對象,指明父對象
2、設置對象屬性
3、信號與槽
4、佈局
5、”show“出來
所以在這裏我不詳細介紹構造函數的實現代碼了,我們來分析下我們重新聲明的accept()
void CloginDlg::accept()
{
if(nameEdit->text().trimmed() == tr("qt") && pwdEdit->text() == tr("1234"))
{
QDialog::accept();
}
else
{
QMessageBox::warning(this, tr("waring"), "user name or password is wrong", QMessageBox::Yes);
nameEdit->setFocus();
}
}
QLineEdit::text()返回的類型是一個QString字符串。
Qstring::trimmed() const 我們看看Qt的幫助文檔
Returns a string that has whitespace removed from the start and the end.
Whitespace means any character for which QChar::isSpace() returns true. This includes the ASCII characters '\t', '\n', '\v', '\f', '\r', and ' '.
它主要是用來移除字符串開頭和結尾的”空白字符“的。如果用戶名和密碼全部正確,調用父類的QDialog::accept()槽函數,該函數關閉對話框,設置對話框的運行結果爲QDialog::Accepted,併發送QDialog::finished(int result)信號。如果錯誤的話,將會顯示出一個模態的警告提示框。
在這裏附上程序源代碼下載鏈接:http://download.csdn.net/detail/fzu_dianzi/3705440
以上純屬個人學習筆記,如果哪裏錯了,希望提出。願和大家一起共同學習,一起進步。我的郵箱地址是:[email protected]