当前位置: 首页 > article >正文

Qt之登录界面(splash)

在上一篇多文档窗口设计(MDI)的基础上增加了一个登录界面(splash).

该模块可以扩展为常规的软件登录界面。

界面展示如下

如果用户名和密码输入正确,则调到MDI界面,如果用户名和密码一共输入三次以上,则程序强制退出。

保存用户名的作用是,将本次输入正确的用户名和密码保存到注册表(注意注册表里不能直接放铭文密码),下次启动该软件会自动填写用户名。

注册表中保存的数据如下,密码是经过MD5加密过后的。

界面设置如下

编辑框密码隐形显示需要设置

程序结果如下:

主程序main

#include "mainwindow.h"

#include <QApplication>
#include"tlogindialog.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    TLoginDialog *dlgLogin=new TLoginDialog();
    dlgLogin->resize(640,480);
    if(dlgLogin->exec()==QDialog::Accepted)
    {
        MainWindow w;
        w.show();
        return a.exec();
    }
    else
        return 0;

}

tlogindialog.h和tlogindialog.cpp如下

#ifndef TLOGINDIALOG_H
#define TLOGINDIALOG_H

#include <QDialog>

namespace Ui {
class TLoginDialog;
}

class TLoginDialog : public QDialog
{
    Q_OBJECT

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

private:
    Ui::TLoginDialog *ui;
    bool m_moving=false;
    QPoint m_lastPos;
    QString m_user="user";
    QString m_pwd="12345";
    int m_tryCount=0;
    const int M_MAXCOUT=3;
    void readSettings();
    void writeSettings();
    QString encrypt(const QString &str);
    // QWidget interface
protected:
    virtual void mousePressEvent(QMouseEvent *event) override;
    virtual void mouseReleaseEvent(QMouseEvent *event) override;
    virtual void mouseMoveEvent(QMouseEvent *event) override;
private slots:
    void on_btnOk_clicked();
};


#endif // TLOGINDIALOG_H
/************************************************.cpp***************************/
#include "tlogindialog.h"
#include "ui_tlogindialog.h"
#include<QMouseEvent>
#include<QCryptographicHash>
#include<QSettings>
#include<QMessageBox>
TLoginDialog::TLoginDialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::TLoginDialog)
{
    ui->setupUi(this);
    setAttribute(Qt::WA_DeleteOnClose);
    setWindowFlag(Qt::SplashScreen);
    QApplication::setOrganizationName("Sun Company");
    QApplication::setApplicationName("MDI_SPLASH");
    readSettings();

}

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

void TLoginDialog::readSettings()
{
    QSettings settings;
    bool saved=settings.value("saved",false).toBool();
    m_user=settings.value("UserName","user").toString();
    QString defaultPSWD=encrypt("12345");
    m_pwd=settings.value("PSWD",defaultPSWD).toString();
    if(saved)
    {
        ui->EditUser->setText(m_user);
    }
    ui->checkBox->setChecked(saved);
}

void TLoginDialog::writeSettings()
{
    QSettings settings;
    settings.setValue("UserName",m_user);
    settings.setValue("PSWD",m_pwd);
    settings.setValue("saved",ui->checkBox->isChecked());

}

QString TLoginDialog::encrypt(const QString &str)
{
    QByteArray btArray=str.toLocal8Bit();
    QCryptographicHash hash(QCryptographicHash::Md5);
    hash.addData(btArray);
    QByteArray resultArray=hash.result();
    QString md5=resultArray.toHex();
    return md5;
}
void TLoginDialog::mousePressEvent(QMouseEvent *event)
{
    if(event->button()==Qt::LeftButton)
    {
        m_moving=true;
        m_lastPos=event->globalPosition().toPoint()-this->pos();
    }
    return QDialog::mousePressEvent(event);
}

void TLoginDialog::mouseReleaseEvent(QMouseEvent *event)
{
    m_moving=false;
    event->accept();
}

void TLoginDialog::mouseMoveEvent(QMouseEvent *event)
{
    QPoint eventPos=event->globalPosition().toPoint();
    if(m_moving&&(event->buttons()&Qt::LeftButton)
        && (eventPos-m_lastPos-pos()).manhattanLength()>QApplication::startDragDistance())
    {
        move(eventPos-m_lastPos);
        m_lastPos=eventPos-this->pos();
    }
    return QDialog::mouseMoveEvent(event);
}



void TLoginDialog::on_btnOk_clicked()
{
    QString user=ui->EditUser->text().trimmed();
    QString pwd=ui->EditPwd->text().trimmed();
    QString encrptPSWD=encrypt(pwd);
    if((m_user==user)&&(encrptPSWD==m_pwd))
    {
        writeSettings();
        this->accept();
    }
    else
    {
        m_tryCount++;
        if(m_tryCount>M_MAXCOUT)
        {
            QMessageBox::critical(this,"错误","输入错误次数太多,强行退出");
            this->reject();
        }
        else
            QMessageBox::warning(this,"错误提示","用户名或者密码错误");
    }
}


http://www.kler.cn/a/507461.html

相关文章:

  • 如何异地远程访问本地部署的Web-Check实现团队远程检测与维护本地站点
  • 怎么用python写个唤醒睡眠电脑的脚本?
  • 浅谈云计算20 | OpenStack管理模块(下)
  • 80_Redis内存策略
  • 【大数据】机器学习-----模型的评估方法
  • 目标检测新视野 | YOLO、SSD与Faster R-CNN三大目标检测模型深度对比分析
  • PCL 计算点云的均值与标准差【2025最新版】
  • ASP.Net Identity + IODC 解析ReturnUrl
  • 【无线感知会议系列-21 】无线感知6G 研究愿景
  • 电气工程中的计算智能
  • Springboot(五十八)SpringBoot3使用Redisson实现接口的限流功能
  • .Net Core微服务入门全纪录(二)——Consul-服务注册与发现(上)
  • Spring boot学习文档
  • Linux 内核自旋锁spinlock(一)
  • 基于单片机的智能火灾报警系统设计
  • 远程桌面使用是TCP还是UDP?
  • LLM - 大模型 ScallingLaws 的迁移学习与混合训练(PLM) 教程(3)
  • Mysql常见问题处理集锦
  • PTA L1-039 古风排版
  • Bootstrap 下拉菜单
  • 【Redis】Redis大key的危害及解决方案分享
  • WordPress内容保护策略:如何反击并利用被盗内容
  • MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 基础篇 part 5
  • NVIDIA发布个人超算利器project digital,标志着ai元年的开启
  • BERT的中文问答系统64
  • docekr在 x86d的 环境下打包arm64架构的docker包