自定义类CLoginDlg,继承QDialog logindlg.h//对CLoginDlg的声明,包括构造函数的声明,成员函数,成员变量的声明 #ifndef LOGINDLG_H #define LOGINDLG_H #include <QtGui/QDialog> class QLineEdit;//注意:这是类CLineEdit的传递声明,因为在下面使用到了CLineEdit对象指针 class CLoginDlg : public QDialog { Q_OBJECT public: CLoginDlg(QWidget* = 0);//构造函数的声明,QWidget是它的顶级父类 virtual ~CLoginDlg(); public slots: virtual void accept();//从新声明基类QDialog的虚函数accept(),在cpp文件中将重写此函数 private: QLineEdit* usrLineEdit; QLineEdit* pwdLineEdit; }; #endif // LOGINDLG_H logindlg.cpp #include "logindlg.h" #include <QtGui/QtGui> CLoginDlg::CLoginDlg(QWidget* parent) : QDialog(parent)//CLoginDlg类的构造函数 { QLabel* usrLabel = new QLabel(tr("用户名:"));//创建一个QLabel的指针对象,名为"用户名" QLabel* pwdLabel = new QLabel(tr("密 码:"));//创建一个QLabel的指针对象,名为"密码" usrLineEdit = new QLineEdit;//usrLineEdit已在头文件中声明,为QLineEdit类的指针对象 pwdLineEdit = new QLineEdit;//pwdLineEdit已在头文件中声明,为QLineEdit类的指针对象 pwdLineEdit->setEchoMode(QLineEdit::Password);//设置pwdLineEdit的现实方式 /////////////////////////////////////////////////////////////////////// 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);//创建一个网格布局管理器指针对象gridLayout,并将usrLabel,usrLineEdit,pwdLabel,pwdLineEdit 放入此网格管理器 /////////////////////////////////////////////////////////////////////// QPushButton* okBtn = new QPushButton(tr("确定")); QPushButton* cancelBtn = new QPushButton(tr("取消")); 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); //创建按钮指针对象okBtn和cancelBtn,创建水平布局管理器指针对象btnLayout,垂直布局管理//器指针对象dlgLayout,并进行一些设置 /////////////////////////////////////////////////////////////////////// connect(okBtn, SIGNAL(clicked()), this, SLOT(accept())); connect(cancelBtn, SIGNAL(clicked()), this, SLOT(reject())); //信号与槽的关联 /////////////////////////////////////////////////////////////////////// setWindowTitle(tr("登录")); resize(300, 200); } CLoginDlg::~CLoginDlg()//析构函数 { delete usrLineEdit; delete pwdLineEdit; } void CLoginDlg::accept()//重写accept()函数 { if(usrLineEdit->text().trimmed() == tr("xuri") && pwdLineEdit->text() == tr("123")) { QDialog::accept(); } else { QMessageBox::warning(this, tr("警告"), tr("用户或密码错误!"), QMessageBox::Yes); usrLineEdit->setFocus(); } } main.cpp #include <QtGui/QtGui> #include "logindlg.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); QTextCodec::setCodecForTr(QTextCodec::codecForName("gb18030")); CLoginDlg dlg; return dlg.exec(); }