对话框一般用来提供反馈信息或从用户处获取输入,Qt 实现了很丰富的对话框类。
1、首先我们来看看QDialog的类关系
2、模态对话框和非模态对话框
所谓模态对话框就是在其没有被关闭之前,用户不能与同一个应用程序的其他窗口进行交互,直到该对话框关闭。对于非模态对话框,当被打开时,用户既可选择和该对话框进行交互,也可以选择同应用程序的其他窗口交互。
在Qt中,Qt的模态与非模态对话框是通过其属性modal来确定的。我们来看看modal属性,其定义:
- modal:bool
而使用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
- virtual void accept();
在我学习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();
- }
- }
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