Qt开发——软件密码登录(MD5加密+注册表)

目录

效果图:

原用户名:xdu

原密码:123456

输入错误提示:

输入正确后跳转:

超过最大尝试次数,退出程序:

简单讲一下思路:

main.cpp

mainwindow.cpp

mainwindow.h

dlglogin.cpp

dlglogin.h


效果图:

原用户名:xdu

原密码:123456

输入错误提示:

输入正确后跳转:

超过最大尝试次数,退出程序:

思路简述:

新建一个Qt Designer Form Class做为登录对话框,可参考程序启动图的那个开发程序:

https://blog.csdn.net/qq_41895747/article/details/104057013

md5加密。。。我也不是太懂密码学这块,用的QcryptographicHash里现成的

注册表这个,其实在这个程序里面没有必要,因为我还没有添加修改注册的功能……后面可以拓展

两个UI很简单
 

XML就不贴了。。。

main.cpp

#include "mainwindow.h"
#include "qdlglogin.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QDlgLogin *dlgLogin = new QDlgLogin;
    if(dlgLogin->exec()==QDialog::Accepted){//运行登录对话框,如果结果正确
        MainWindow w;//运行主窗口
        w.show();
        return a.exec();
    }
    return 0;
}

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setWindowIcon(QIcon("icon.png"));
    setWindowTitle(QStringLiteral("登录后对话框"));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_actionExit_triggered()
{

}

void MainWindow::on_pushButton_clicked()
{
    this->close();
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_actionExit_triggered();

    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

dlglogin.cpp

#include "qdlglogin.h"
#include "ui_qdlglogin.h"

QDlgLogin::QDlgLogin(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::QDlgLogin)
{
    ui->setupUi(this);
    qDebug()<<QStringLiteral("原用户名和密码:")<<m_user<<m_pswd<<endl;
    ui->PasseordEdit->setEchoMode(QLineEdit::Password);//设置为密码输入方式
    this->setAttribute(Qt::WA_DeleteOnClose);//设置为关闭时删除
    this->setWindowFlags(Qt::SplashScreen);//设置为SplashScreen
    this->setWindowFlag(Qt::FramelessWindowHint);//设置为无边框模式
    readSettings();//读取用户密码
}

QDlgLogin::~QDlgLogin()
{
    delete ui;
}

//按下确定键
void QDlgLogin::on_OkBtn_clicked()
{
    QString user = ui->UserEdit->text().trimmed();//输入用户名
    QString pswd = ui->PasseordEdit->text().trimmed();//输入密码
    qDebug()<<QStringLiteral("输入用户名和密码:")<<user<<pswd<<endl;
    QString encrptPSWD = encrypt(pswd);//对输入密码进行加密
    qDebug()<<QStringLiteral("输入密码加密后:")<<encrptPSWD<<endl;
    if((user==m_user)&&(encrptPSWD==m_pswd)){//如果输入的用户名和密码正确
        writeSettings();//保存用户名和密码
        this->accept();//关闭对话框
    }else{
        m_tryCount++;//试错次数加一
        if(m_tryCount>5){//输入错误次数大于5
            QMessageBox::critical(this,QStringLiteral("Error"),QStringLiteral("输入错误的次数过多,强行退出!"));
            this->reject();//退出拒绝
        }else{
            QMessageBox::warning(this,QStringLiteral("错误提示"),QStringLiteral("用户名或密码错误!\n请重新输入!"));
        }
    }
}

//按下取消键
void QDlgLogin::on_CancleBtn_clicked()
{
    this->close();//退出程序
}

//读取用户名和密码
void QDlgLogin::readSettings(){
    QString organization = "WWB-Qt";
    QString appName = "Login";
    QSettings settings(organization,appName);
    bool saved=settings.value("saved",false).toBool();//读取saved
    m_user = settings.value("Username","user").toString();//读取UserName
//    QString defaultPSWD = encrypt("123");//加密初始密码后的数据
    QString defaultPSWD = encrypt(m_pswd);//加密初始密码后的数据
    m_pswd = settings.value("PSWD",defaultPSWD).toString();//读取PSWD
    qDebug()<<QStringLiteral("原密码加密后:")<<defaultPSWD<<endl;
    if(saved){//设置用户名并保存
        ui->UserEdit->setText(m_user);
        ui->checkBox->setChecked(saved);
    }
}

//保存用户名和密码
void QDlgLogin::writeSettings(){
    QSettings settings("WWB-Qt","Login");
    settings.setValue("Username",m_user);
    settings.setValue("PSDW",m_pswd);
    settings.setValue("saved",ui->checkBox->isChecked());//保存用户名按钮被勾选后
}

//自定义加密函数
QString QDlgLogin::encrypt(const QString &str)
{ //字符串MD5算法加密
    QByteArray btArray;

    btArray.append(str);//加入原始字符串

    QCryptographicHash hash(QCryptographicHash::Md5);  //Md5加密算法

    hash.addData(btArray);  //添加数据到加密哈希值

    QByteArray resultArray =hash.result();  //返回最终的哈希值

    QString md5 =resultArray.toHex();//转换为16进制字符串

    return  md5;
}

dlglogin.h

#ifndef QDLGLOGIN_H
#define QDLGLOGIN_H

#include <QDialog>
#include <QCryptographicHash>
#include <QSettings>
#include <QSplashScreen>
#include <QMessageBox>
#include <QByteArray>
#include <QDebug>

namespace Ui {
class QDlgLogin;
}

class QDlgLogin : public QDialog
{
    Q_OBJECT

public:
    explicit QDlgLogin(QWidget *parent = nullptr);
    ~QDlgLogin();

private slots:
    void on_OkBtn_clicked();//按下确定键
    void on_CancleBtn_clicked();//按下取消键

private:
    Ui::QDlgLogin *ui;

    bool    m_moving=false;//表示窗口是否在鼠标操作下移动
    QPoint  m_lastPos;  //上一次的鼠标位置

    QString m_user="xdu"; //初始化用户名
    QString m_pswd="123456";//初始化密码,未加密的

    int m_tryCount=0; //试错次数

    void readSettings(); //读取设置,从注册表
    void writeSettings();//写入设置,从注册表

    QString encrypt(const QString& str);//字符串加密
};

#endif // QDLGLOGIN_H
发布了287 篇原创文章 · 获赞 297 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_41895747/article/details/104135166
今日推荐