今天我们来讲一讲Qt中对话框的使用,通过本篇博客你会学会如何编写一个简单的对话框,我们以最常见的登录对话框为例。
首先,要强调的是,QDialog是所有Qt对话框窗口的基类,它继承自QWidget。我们自定义一个对话框类CLoginDlg,很明显它要继承自QDialog,因此必须包含基类QDialog的定义。
#ifndef LOGINDLG_H
#define LOGINDLG_H
#include <QtGui/QDialog>
class QLineEdit;
class CLoginDlg : public QDialog
{
Q_OBJECT
public:
CLoginDlg(QWidget* = 0);
public slots:
virtual void accept(); //虚函数,点击确定按钮之后的接受函数
private:
QLineEdit* usrLineEdit; //输入用户名的框
QLineEdit* pwdLineEdit; //输入密码的框
};
#endif // LOGINDLG_H
以上属于CLoginDlg类的声明,我们把它放在logindlg.h文件中。
然后,我们还需要创建一个logindlg.cpp文件,用来实现类中的方法,这里主要是基类中的方法和CLoginDig中的accept()方法。本质上说,就是实现一个登录对话框界面的布局,里面涉及到了Qt中的控件。
#include <QtGui/QtGui>
#include "logindlg.h"
CLoginDlg::CLoginDlg(QWidget * parent)
: QDialog(parent)
{
QLabel *usrLabel = new QLabel(trUtf8("用户名:"));
QLabel *pwdLabel = new QLabel(trUtf8("密码:"));
usrLineEdit = new QLineEdit;
pwdLineEdit = new QLineEdit;
pwdLineEdit->setEchoMode(QLineEdit::Password);
//布局
QGridLayout *gridLayout = new QGridLayout;
gridLayout->addWidget(usrLabel,0,0,1,1);
gridLayout->addWidget(pwdLabel,1,0,1,1);
gridLayout->addWidget(usrLineEdit,0,1,1,3);
gridLayout->addWidget(pwdLineEdit,1,1,1,3);
QPushButton* okBtn = new QPushButton(trUtf8("确定"));
QPushButton* cancelBtn = new QPushButton(trUtf8("取消"));
QHBoxLayout* btnLayout = new QHBoxLayout;
btnLayout->setSpacing(60);
btnLayout->addWidget(okBtn);
btnLayout->addWidget(cancelBtn);
QVBoxLayout* 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(trUtf8("登录"));
resize(300,200);
}
void CLoginDlg::accept()
{
if(usrLineEdit->text().trimmed() == tr("lcf") && pwdLineEdit->text() == tr
("lcf"))
{
QDialog::accept();
}
else
{
QMessageBox::warning(this,trUtf8("警告"),trUtf8("用户名或密码错误"),
QMessageBox::Yes);
usrLineEdit->setFocus();
}
}
最后一个accept()函数就是判断用户名密码是否匹配正确,能否接受。
主函数main()中的代码如下,主要是声明了一个CLoginDig对象,并进入了对话框对象dlg的事件循环。当登录对话框结束运行完毕之后将返回它的运行结果。注意:Qt GUI程序必须有且仅有一个QApplication对象,但是可以不启动Qt应用程序QApplication对象的事件循环。
#include <QApplication>
#include <QtGui/QtGui>
#include <logindlg.h>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
CLoginDlg dlg;
dlg.exec();
}
最后运行的结果如下:(程序中设定,用户名、密码都为lcf)