关闭

qt学习笔记(三)之对话框-QDialog

216人阅读 评论(0) 收藏 举报
分类:

对话框一般用来提供反馈信息或从用户处获取输入,Qt 实现了很丰富的对话框类。

1、首先我们来看看QDialog的类关系


2、模态对话框和非模态对话框

所谓模态对话框就是在其没有被关闭之前,用户不能与同一个应用程序的其他窗口进行交互,直到该对话框关闭。对于非模态对话框,当被打开时,用户既可选择和该对话框进行交互,也可以选择同应用程序的其他窗口交互。

在Qt中,Qt的模态与非模态对话框是通过其属性modal来确定的。我们来看看modal属性,其定义:

  1. modal:bool  
默认情况下,对话框的该属性是false,这时候通过show()方法显示的对话框就是非模态对话框。

而使用exec()方法显示对话框的话,将忽略modal属性值的设置并把对话框设置为模态对话框,

一般使用setmodal()方法来设置对话框的modal属性。

非模态对话框如果是栈对象,当代码退出对话框对象的作用域后,该对话框就会自动销毁了,这就造成用户来不及和对话框进行交互,对话框就消失了。因此,必须通过new操作在堆中创建非模态对话框。

3、代码解析

loginDlg.h

  1. #ifndef LOGINDLG_H  
  2. #define LOGINDLG_H  
  3.   
  4. #include <QDialog>  
  5.   
  6. class QLineEdit;  
  7. namespace Ui {  
  8.     class CloginDlg;  
  9. }  
  10.   
  11. class CloginDlg : public QDialog  
  12. {  
  13.     Q_OBJECT  
  14.   
  15. public:  
  16.     explicit CloginDlg(QWidget *parent = 0);  
  17.     ~CloginDlg();  
  18. public slots:  
  19.     virtual void accept();  
  20. private:  
  21.     Ui::CloginDlg *ui;  
  22.     QLineEdit *nameEdit;  
  23.     QLineEdit *pwdEdit;  
  24. };  
  25.   
  26. #endif // LOGINDLG_H  

第六行 我们声明了QLineEdit,因为在该头文件,我们仅仅使用了指向QLineEdit类的指针。

查阅了部分书籍,原段

/*

首先,它减小了头文件的大小,增加了编译速度(特别是当头文件被其他文件多次包含引用时);

其实,这样做可以避免因为头文件的顺序不当而造成连接错误,特别是在大的工程当中更应该避免随意地在一个头文件包含另一个头文件。

*/

代码中出现的Ui是因为我们添加了Qt Designer文件

  1. Q_OBJECT  
宏的作用是启动Qt元对象的一些特性(比如支持信号与槽等),它必须放置到类定义的私有区。///????私有区

  1. virtual void accept();  
重新声明了QDialog类的虚函数accept()。因为我们的功能要求点击ok后还必须验证账号与密码的正确性。

在我学习Qt短短几个星期的体验中,我们在”画“界面的时候通常有几个步骤

1、定义类对象,指明父对象

2、设置对象属性

3、信号与槽

4、布局

5、”show“出来

所以在这里我不详细介绍构造函数的实现代码了,我们来分析下我们重新声明的accept()

  1. void CloginDlg::accept()  
  2. {  
  3.     if(nameEdit->text().trimmed() == tr("qt") && pwdEdit->text() == tr("1234"))  
  4.     {  
  5.         QDialog::accept();  
  6.     }  
  7.     else  
  8.     {  
  9.         QMessageBox::warning(this, tr("waring"), "user name or password is wrong", QMessageBox::Yes);  
  10.         nameEdit->setFocus();  
  11.     }  
  12. }  
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)信号。如果错误的话,将会显示出一个模态的警告提示框。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:59132次
    • 积分:1033
    • 等级:
    • 排名:千里之外
    • 原创:24篇
    • 转载:89篇
    • 译文:9篇
    • 评论:0条