Splash与登录窗口
作者:互联网
#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