ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Splash与登录窗口

2021-07-19 17:03:57  阅读:226  来源: 互联网

标签:窗口 登录 void Splash ui QString Dialog include event


#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QPoint>

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

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

private:
    Ui::Dialog *ui;
    QImage* img;
private:
    bool m_moving =false;  //表示窗口是否在鼠标操作下移动
    QPoint m_lastPos; //上一次的鼠标位置
    QString m_user= "user"; //初始化用户名
    QString m_pswd = "123456";//初始化密码,未加密
    int m_tryCount = 0; //试错次数
    void readSettings(); //读取配置,注册表
    void writeSettings(); //写入配置,注册表
    QString encrypt(const QString & str); //字符串加密
protected:
    //鼠标拖动窗口的鼠标事件
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
private slots:
    void on_pushButton_clicked();
    void on_pushButton_2_clicked();
};

#endif // DIALOG_H



#include "dialog.h"
#include "ui_dialog.h"
#include <QSettings>
#include <QCryptographicHash>
#include <QMessageBox>
#include <QMouseEvent>

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    img = new QImage;
    img->load(QString("./Desert.jpg"));
    QImage scaledimg;
    scaledimg = img->scaled(ui->label->width(),ui->label->height(),Qt::KeepAspectRatio);
    ui->label->setPixmap(QPixmap::fromImage(scaledimg));
    ui->lineEdit_2->setEchoMode(QLineEdit::Password);//设置为密码输入模式
    this->setAttribute(Qt::WA_DeleteOnClose);//设置为关闭时删除
    this->setWindowFlags(Qt::SplashScreen);//设置为SplashScreen
    // this->setWindowFlags(Qt::FramelessWindowHint);//设置为无边框,但在任务栏显示标题
    readSettings();
}

Dialog::~Dialog()
{
    delete img;
    img = nullptr;
    delete ui;
}
//读取存储的用户名和密码,密码是经过加密的
void Dialog::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("123456");//缺省值'123456'加密后的密码
    m_pswd = settings.value("PSWD",defaultPSWD).toString();//读取pswd
    if(saved)
    {
        ui->lineEdit->setText(m_user);
        ui->checkBox->setChecked(saved);
    }
}

void Dialog::writeSettings()
{
    QSettings settings("WWB-Qt","login");//注册表键组
  //指向的注册表目录是HKEY_CURRENT_USER/Software/WWB-Qt/login
  //Windows开始菜单输入框输入regedit 打开注册表
   //打开HKEY_CURRENT_USER/Software/WWB-Qt/login可以看到参数存储情况 密码是加密后的字符串
    settings.setValue("Username",m_user);//用户名
    settings.setValue("PSWD",m_pswd);//加密过的密码
    settings.setValue("saved",ui->checkBox->isChecked());

}

QString Dialog::encrypt(const QString &str)
{
    QByteArray btArray;
    btArray.append(str);
    QCryptographicHash hash(QCryptographicHash::Md5); //MD5 加密算法
    hash.addData(btArray);
    QByteArray resultArray = hash.result(); //返回最终的散列值
    QString md5 = resultArray.toHex(); //转换成16进制的字符串
    return md5;
}
//鼠标按键被按下
void Dialog::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton)
    {
        m_moving = true;
        m_lastPos =event->globalPos() - pos();//记录下鼠标相对于窗口的位置
    }
    return QDialog::mousePressEvent(event);
}
//鼠标按下左键移动
void Dialog::mouseMoveEvent(QMouseEvent *event)
{
    if(m_moving &&(event->buttons() &&Qt::LeftButton)&&(event->globalPos()- m_lastPos).manhattanLength() > QApplication::startDragDistance())
    {
        move(event->globalPos() -m_lastPos);
    }
    return QDialog::mouseMoveEvent(event);
}
//鼠标按键释放
void Dialog::mouseReleaseEvent(QMouseEvent *event)
{
    m_moving =false;
}


void Dialog::on_pushButton_clicked()
{
    QString user = ui->lineEdit->text().trimmed(); //输入用户名
    QString pswd = ui->lineEdit_2->text().trimmed();//输入密码
    QString encrptPSWD = encrypt(pswd);
    if((user==m_user)&&(encrptPSWD==m_pswd))
    {
        writeSettings();
        this->accept(); //对话框accept(),关闭对话框
    }else {
        m_tryCount++;
        if(m_tryCount>3)
        {
            QMessageBox::critical(this,"错误","输入错误次数太多,强行退出");
            this->reject();//退出
        }else
        {
            QMessageBox::warning(this,"错误提示","用户名或密码错误");
        }
    }
}

void Dialog::on_pushButton_2_clicked()
{
    this->accept();
}

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

    Dialog *dlglogin = new Dialog;
    if(dlglogin->exec() == QDialog::Accepted)
    {
        QDialog w;
        w.show();
        return a.exec();
    }else {
        return  0;
    }

}

标签:窗口,登录,void,Splash,ui,QString,Dialog,include,event
来源: https://www.cnblogs.com/lllion/p/15030974.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有