一.应用场景
一般我们的软件和应用都会一个登录界面或者加载界面,然后再到我们真正的界面,所以这节课我们来学习如何自定义一个启动窗口,和那些需要注意的地方!
二.界面类设计窗口
用Label来添加背景图片
三.main中创建
运行结果:
但是现在点击登录和取消没有用,可以去转到槽.
现在就能够点击了!
四.窗口显示标识
但是发现现在还有一个窗口主题,我们可以去掉,让其更美观
下面的任务栏还在
这种模式就都没有了!
五.功能实现
1.读取注册表
为了演示我们的功能,我们来使用注册表来读取信息.
具体实现:
void DialogLogin::loadSetting() { QSettings setting("YAO","GE");//相当于两层目录 m_user=setting.value("user_name","yaoguolin").toString();//user_name为字段,如果没有找到信息就"yaoguolin"默认 m_pwd=setting.value("pwd","123456").toString(); m_saved=setting.value("saved",false).toBool(); if(m_saved==true)//如果勾选保存下次登录就把用户名自动的加上 { ui->lineEditUserName->setText(m_user); ui->checkBox->setCheckState(Qt::Checked); } }
2.md5加密
但是这里有一点不安全就是密码直接保存,因此我们需要使用md5算法来提高密码安全性!
QString DialogLogin::encrypt(const QString& pwd) { QByteArray array; array.append(pwd);//将原始密码添加进来 //用md5模式创建加密对象 QCryptographicHash hash(QCryptographicHash::Md5); hash.addData(array);//添加加密数据 QByteArray res=hash.result();//返回加密结果 QString str=res.toHex();//转换为16进制字符串返回 return str; }
可以用在这里了
3.登录实现
void DialogLogin::on_pushButtonOK_clicked() { QString user=ui->lineEditUserName->text().trimmed(); QString pwd=ui->lineEditPWD->text().trimmed(); if(user==m_user&&encrypt(pwd)==m_pwd) { accept();//登录成功 //我们要将输入的信息保存到注册表 } else { m_count++; if(m_count>3)//大于3次直接退出程序 { QMessageBox::critical(this,"严重错误","用户名或密码输入错误多次!"); reject(); } else { QMessageBox::warning(this,"错误","用户名或密码错误!"); } } }
4.保存注册表
void DialogLogin::saveSetting() { QSettings setting("YAO","GE");//必须与刚刚创建的一样 setting.setValue("user_name",m_user);//字段必须一样 setting.setValue("pwd",m_pwd); setting.setValue("saved",ui->checkBox->checkState()); }
5.功能演示
完整代码:
#include "dialoglogin.h" #include "ui_dialoglogin.h" #include <QSettings>//注册表 #include <QCryptographicHash>//md5 #include <QMessageBox> DialogLogin::DialogLogin(QWidget *parent) : QDialog(parent), ui(new Ui::DialogLogin) { ui->setupUi(this); this->setAttribute(Qt::WA_DeleteOnClose);//关闭窗口时销毁 ui->lineEditPWD->setEchoMode(QLineEdit::Password);//输入密码时,看不到 //this->setWindowFlags(Qt::FramelessWindowHint);//去掉主题栏,任务栏还在 this->setWindowFlags(Qt::SplashScreen);//都没有了 loadSetting(); } DialogLogin::~DialogLogin() { delete ui; } void DialogLogin::on_pushButtonOK_clicked() { QString user=ui->lineEditUserName->text().trimmed(); QString pwd=ui->lineEditPWD->text().trimmed(); if(user==m_user&&encrypt(pwd)==m_pwd) { accept();//登录成功 //我们要将输入的信息保存到注册表 saveSetting(); } else { m_count++; if(m_count>3)//大于3次直接退出程序 { QMessageBox::critical(this,"严重错误","用户名或密码输入错误多次!"); reject(); } else { QMessageBox::warning(this,"错误","用户名或密码错误!"); } } } void DialogLogin::on_pushButtonCancel_clicked() { reject(); } void DialogLogin::loadSetting() { QSettings setting("YAO","GE");//相当于两层目录 m_user=setting.value("user_name","yaoguolin").toString();//user_name为字段,如果没有找到信息就"yaoguolin"默认 m_pwd=setting.value("pwd",encrypt("123456")).toString(); m_saved=setting.value("saved",false).toBool(); if(m_saved==true)//如果勾选保存下次登录就把用户名自动的加上 { ui->lineEditUserName->setText(m_user); ui->checkBox->setCheckState(Qt::Checked); } } QString DialogLogin::encrypt(const QString& pwd) { QByteArray array; array.append(pwd);//将原始密码添加进来 //用md5模式创建加密对象 QCryptographicHash hash(QCryptographicHash::Md5); hash.addData(array);//添加加密数据 QByteArray res=hash.result();//返回加密结果 QString str=res.toHex();//转换为16进制字符串返回 return str; } void DialogLogin::saveSetting() { QSettings setting("YAO","GE");//必须与刚刚创建的一样 setting.setValue("user_name",m_user);//字段必须一样 setting.setValue("pwd",m_pwd); setting.setValue("saved",ui->checkBox->checkState()); }
运行结果:
密码正确就进入主窗口:
下次登录自动输入了用户名:
六.鼠标事件拖动窗口
当我们将主题栏去掉以后,我们就不能对窗口进行拖动了,但是我们可以通过鼠标事件来移动我们的窗口.
1.找到鼠标事件的函数
在widget中
拷贝到窗口头文件中:
2.点击事件
void DialogLogin::mousePressEvent(QMouseEvent *event) { if(event->button()==Qt::LeftButton)//如果左击鼠标 { this->moved=true;//开始移动 lastPos=event->globalPos()-this->pos();//鼠标的全局位置-窗口的左上角的位置=鼠标在窗口的相对位置 } return QDialog::mousePressEvent(event);//返回给父类 }
3.移动事件
void DialogLogin::mouseMoveEvent(QMouseEvent *event) { if(this->moved)//如果点击了,移动函数就启动 { this->move(event->globalPos()-lastPos);//鼠标当前的全局位置减去刚刚的相对位置的距离就是窗口移动的距离 lastPos=event->globalPos()-pos();//新的相对位置 } return QDialog::mouseMoveEvent(event); }
4.释放事件
void DialogLogin::mouseReleaseEvent(QMouseEvent *event) { this->moved=false;//松开按键就关闭移动 return QDialog::mouseReleaseEvent(event); }
现在我们的窗口就可以移动了,你也去试试吧,哈哈哈,记得鼠标事件加个QMouseEvent的头文件哦.
七.总结
启动窗口的玩法,用在的地方还是蛮多的,不管是为了加载资源,还是说为了登录验证,都会用到这个,因为可以是自定义的嘛,所有你们可以充分的发挥出你们的想象力!
静