实现功能:
在弹出对话框中填写用户名和密码,按下登录按钮,如果用户名和密码均正确则进入主窗口,如果有错则弹出警告对话框。
实现原理:
通过上节的多窗口原理实现由登录对话框进入主窗口,而用户名和密码可以用 if 语句进行判断。
实现过程:
1.先新建 Qt工程,工程名为 LoginPro,选用 QWidget 作为 Base class,这样便建立了主窗口。文件列表如下:(不清楚创建可以看:Qt 5.12 编写多窗口程序(新手手把手教学)
2、然后新建一个 Qt Designer Form Class 类,类名为 logindlg,选用 Dialog without Buttons,将其加入上面的工程中。文件列表如下:
3、在 logindlg.ui 中设计下面的界面:行输入框为 Line Edit。其中用户名后面的输入框在属性中设置其 object Name 为 usrLineEdit,密码后面的输入框为 pwdLineEdit,登录按钮为loginBtn,退出按钮为 exitBtn。
4、将 exitBtn 的单击后效果设为退出程序,关联如下:
5、右击登录按钮选择 go to slot,再选择 clicked(),然后进入其单击事件的槽函数,写入一句
void logindlg::on_loginBtn_clicked()
{
accept();
}
#include "logindlg.h"
#include "ui_logindlg.h"
logindlg::logindlg(QWidget *parent) :
QDialog(parent),
ui(new Ui::logindlg)
{
ui->setupUi(this);
}
logindlg::~logindlg()
{
delete ui;
}
void logindlg::on_loginBtn_clicked()
{
accept();
}
6、改写 main.cpp:
#include "widget.h"
#include <QApplication>
#include "logindlg.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
logindlg login;
if(login.exec()==QDialog::Accepted)
{
w.show();
return a.exec();
}
else return 0;
}
8、添加用户名密码判断功能。将登陆按钮的槽函数改为:
void logindlg::on_loginBtn_clicked()
{
//accept();
if(ui->usrLineEdit->text()==tr("qt")&&ui->pwdLineEdit->text()==tr("123456"))
{
accept();
}else{
//如果不正确,弹出警告对话框
QMessageBox::warning(this,tr("Warning"),tr("user name or password error!"),QMessageBox::Yes);
}
}
#include "logindlg.h"
#include "ui_logindlg.h"
#include <QtGui>
#include <QMessageBox>
logindlg::logindlg(QWidget *parent) :
QDialog(parent),
ui(new Ui::logindlg)
{
ui->setupUi(this);
ui->pwdLineEdit->setEchoMode(QLineEdit::Password);
}
logindlg::~logindlg()
{
delete ui;
}
void logindlg::on_loginBtn_clicked()
{
//accept();
if(ui->usrLineEdit->text()==tr("qt")&&ui->pwdLineEdit->text()==tr("123456"))
{
accept();
}else{
//如果不正确,弹出警告对话框
QMessageBox::warning(this,tr("Warning"),tr("user name or password error!"),QMessageBox::Yes);
}
}
9、这时再执行程序,输入用户名为 qt,密码为 123456,按登录按钮便能进入主窗口了,如果输入错了,就会弹出警告对话框。
如果输入错误,便会弹出警告提示框:
10、在 logindlg.cpp 的 loginDlg 类构造函数里,添上初始化语句,使密码显示为小黑点。
logindlg::logindlg(QWidget *parent) :
QDialog(parent),
ui(new Ui::logindlg)
{
ui->setupUi(this);
ui->pwdLineEdit->setEchoMode(QLineEdit::Password);
}
11、如果输入如下图中的用户名,在用户名前不小心加上了一些空格,结果程序按错误的用户名对待了。
我们可以更改 if 判断语句,使这样的输入也算正确。
void logindlg::on_loginBtn_clicked()
{
//accept();
if(ui->usrLineEdit->text().trimmed()==tr("qt")&&ui->pwdLineEdit->text()==tr("123456"))
{
accept();
}else{
//如果不正确,弹出警告对话框
QMessageBox::warning(this,tr("Warning"),tr("user name or password error!"),QMessageBox::Yes);
}
}
加入的这个函数的作用就是移除字符串开头和结尾的空白字符。
12、最后,如果输入错误了,重新回到登录对话框时,我们希望可以使用户名和密码框清空并且光标自动跳转到用户名输入框,最终的登录按钮的单击事件的槽函数如下:
void logindlg::on_loginBtn_clicked()
{
//accept();
if(ui->usrLineEdit->text().trimmed()==tr("qt")&&ui->pwdLineEdit->text()==tr("123456"))
{
accept();
}else{
//如果不正确,弹出警告对话框
QMessageBox::warning(this,tr("Warning"),tr("user name or password error!"),QMessageBox::Yes);
ui->usrLineEdit->clear();//清空用户名输入框
ui->pwdLineEdit->clear();//清空密码输入框
ui->usrLineEdit->setFocus();//将光标转到用户名输入框
}
}
最终的 loginDlg.cpp 文件如下:
#include "logindlg.h"
#include "ui_logindlg.h"
#include <QtGui>
#include <QMessageBox>
logindlg::logindlg(QWidget *parent) :
QDialog(parent),
ui(new Ui::logindlg)
{
ui->setupUi(this);
ui->pwdLineEdit->setEchoMode(QLineEdit::Password);
}
logindlg::~logindlg()
{
delete ui;
}
void logindlg::on_loginBtn_clicked()
{
//accept();
if(ui->usrLineEdit->text().trimmed()==tr("qt")&&ui->pwdLineEdit->text()==tr("123456"))
{
accept();
}else{
//如果不正确,弹出警告对话框
QMessageBox::warning(this,tr("Warning"),tr("user name or password error!"),QMessageBox::Yes);
ui->usrLineEdit->clear();//清空用户名输入框
ui->pwdLineEdit->clear();//清空密码输入框
ui->usrLineEdit->setFocus();//将光标转到用户名输入框
}
}