Qt功能优化:简易登录模板
前言
一个相对健全的软件,一般均有登录注册功能,但是对于大部分初学者来说,想要实现该功能,还需要学习数据库等相关知识。那么,有没有一种不需要学习数据库等相关知识,就能实现相关功能呢?
一、效果图
如图1所示,为我用XML文件储存账号密码,并采用MD5加密技术,用来实现相关的登录功能,来帮助Qt初学者们在短时间内迅速完成一个相对功能健全的软件。
二、相关源代码
1. .xml部分
userlog.xml
<?xml version='1.0' encoding='UTF-8'?>
<用户账号>
<user id="1">
<用户名>水漂奇鼋</用户名>
<密码>19830925</密码>
</user>
<user id="2">
<用户名>忆梦茹澜</用户名>
<密码>12345678</密码>
</user>
<user id="3">
<用户名>测试1</用户名>
<密码>123456</密码>
</用户账号>
MD5加密版,后三个密码均为123456
<?xml version='1.0' encoding='UTF-8'?>
<用户账号>
<user id="1">
<用户名>000001</用户名>
<密码>f0133c214d7fd02868f74de30d932a62</密码>
</user>
<user id="2">
<用户名>666666</用户名>
<密码>e10adc3949ba59abbe56e057f20f883e</密码>
</user>
<user id="3">
<用户名>888888</用户名>
<密码>e10adc3949ba59abbe56e057f20f883e</密码>
</user>
<user id="4">
<用户名>2078411248</用户名>
<密码>e10adc3949ba59abbe56e057f20f883e</密码>
</user>
</用户账号>
2. .h部分
LoginDialog.h
#ifndef LOGINDIALOG_H
#define LOGINDIALOG_H
#include <QDialog>
#include "mainwindow.h"
#include <QFile>
#include "qdom.h"
#include <QMessageBox>
namespace Ui {
class LoginDialog;
}
class LoginDialog : public QDialog
{
Q_OBJECT
public:
explicit LoginDialog(QWidget *parent = 0);
~LoginDialog();
private slots:
void on_loginPushButton_clicked();
void showWeiChatWindow();
private:
Ui::LoginDialog *ui;
MainWindow *weiChatWindow;
QDomDocument mydoc;
};
#endif // LOGINDIALOG_H
MD5加密版
#ifndef LOGINDIALOG_H
#define LOGINDIALOG_H
#include <QDialog>
#include <QCryptographicHash>
#include "mainwindow.h"
#include <QFile>
#include "qdom.h"
#include <QMessageBox>
namespace Ui {
class LoginDialog;
}
class LoginDialog : public QDialog
{
Q_OBJECT
public:
explicit LoginDialog(QWidget *parent = 0);
~LoginDialog();
QString strToMd5(QString str);
QString convertMD5(QString inStr);
private slots:
void on_PawBtn_clicked(); //密码登录
void on_loginPushButton_clicked();
void showWeiChatWindow();
private:
Ui::LoginDialog *ui;
MainWindow *weiChatWindow;
QDomDocument mydoc;
void keyPressEvent(QKeyEvent *event);
};
#endif // LOGINDIALOG_H
3. .cpp部分
LoginDialog.cpp
#include "logindialog.h"
#include "ui_logindialog.h"
LoginDialog::LoginDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::LoginDialog)
{
ui->setupUi(this);
ui->pwdLineEdit->setFocus();// setFocus为对焦点,使光标移到此处
}
LoginDialog::~LoginDialog()
{
delete ui;
}
void LoginDialog::on_loginPushButton_clicked()
{
showWeiChatWindow();
}
void LoginDialog::showWeiChatWindow()
{
QFile file("userlog.xml");
mydoc.setContent(&file);
QDomElement root = mydoc.documentElement();
if (root.hasChildNodes())
{
QDomNodeList userList = root.childNodes();
bool exist = false;
for (int i = 0; i < userList.count(); i++)
{
QDomNode user = userList.at(i);
QDomNodeList record = user.childNodes();
QString uname = record.at(0).toElement().text();
QString pword = record.at(1).toElement().text();
if (uname == ui->usrLineEdit->text())
{
exist = true;
if (!(pword == ui->pwdLineEdit->text()))
{
QMessageBox::warning(0, QObject::tr("提示"), "口令错!请重新输入。");
ui->pwdLineEdit->clear();
ui->pwdLineEdit->setFocus();
return;
}
}
}
if (!exist)
{
QMessageBox::warning(0, QObject::tr("提示"), "此用户不存在!请重新输入。");
ui->usrLineEdit->clear();
ui->pwdLineEdit->clear();
ui->usrLineEdit->setFocus();
return;
}
weiChatWindow = new MainWindow(0);
weiChatWindow->setWindowTitle(ui->usrLineEdit->text());
weiChatWindow->show();
}
}
MD5加密版
//登录
void LoginWidget::on_LoginBtn_clicked()
{
showYXWindow();
}
void LoginWidget::showYXWindow()
{
QFile file("userlog.xml");
mydoc.setContent(&file);
QDomElement root = mydoc.documentElement();
if (root.hasChildNodes())
{
QDomNodeList userList = root.childNodes();
bool exist = false;
for (int i = 0; i < userList.count(); i++)
{
QDomNode user = userList.at(i);
QDomNodeList record = user.childNodes();
QString uname = record.at(0).toElement().text();
QString pword = record.at(1).toElement().text();
QString pwdMd5 = strToMd5(ui->PasLine->text());
//QString pwordJie1 = convertMD5(pword);
//QString pwordJie2 = convertMD5(pwordJie1);
if (uname == ui->usrLine->text())
{
exist = true;
if (!(pword == pwdMd5))
{
QMessageBox::warning(0, QObject::tr("提示"), "口令错!请重新输入。");
ui->PasLine->clear();
ui->PasLine->setFocus();
return;
}
}
}
if (!exist)
{
QMessageBox::warning(0, QObject::tr("提示"), "此用户不存在!请重新输入。");
ui->usrLine->clear();
ui->PasLine->clear();
ui->usrLine->setFocus();
return;
}
MainWidget *YXWindow = new MainWidget();
//weiChatWindow->setWindowTitle(ui->usrLineEdit->text());
YXWindow->show();
this->close();
}
}
QString LoginWidget::strToMd5(QString str)
{
QString strMd5;
QByteArray qba;
qba = QCryptographicHash::hash(str.toLatin1(),QCryptographicHash::Md5);
strMd5.append(qba.toHex());
return strMd5;
}
QString LoginWidget::convertMD5(QString inStr)
{
char a[7];
strcpy(a,inStr.toLocal8Bit().data());
qDebug()<<a;
for(int i=0;i<7;i++){
a[i]=(char)(a[i] ^'t');
}
QString s(a);
qDebug()<<s;
return s;
}
void LoginWidget::keyPressEvent(QKeyEvent *event)
{
if(event->key()==Qt::Key_Return) {
showYXWindow();
}
}
总结
以上是部分Qt关于功能优化的部分,所有相关的Qt界面优化的部分,均在下方专栏——Qt功能优化中,大家如果感兴趣可以进行观看并使用,希望通过这些文章能够使大家的Qt软件更加美观和完美 !!!
另,如果大家有时间的话,也可以在个人主页中的专栏部分,查看我的Qt实战专栏与Qt界面优化专栏哦,里面分别存放有Qt相关的实战软件和相对实用的附属功能,大家感兴趣可以看看(๑><๑)
另附Qt实战:云曦聊天室篇和Qt界面优化:鼠标双击特效两篇相关文章,大家可以下滑到文章下方专栏处,查看相关专栏中的其它文章,希望能帮助到大家,感谢大家支持~( ̄▽ ̄~)~