【qt】启动窗口的玩法

启动窗口的玩法

一.应用场景

一般我们的软件和应用都会一个登录界面或者加载界面,然后再到我们真正的界面,所以这节课我们来学习如何自定义一个启动窗口,和那些需要注意的地方!

二.界面类设计窗口

Label 来添加背景图片

三.main中创建

运行结果:

但是现在点击登录和取消没有用,可以去转到槽.

现在就能够点击了!

四.窗口显示标识

但是发现现在还有一个窗口主题,我们可以去掉,让其更美观

下面的任务栏还在

这种模式就都没有了!

五.功能实现

1.读取注册表

为了演示我们的功能,我们来使用注册表来读取信息.

具体实现:

cpp 复制代码
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算法来提高密码安全性!

cpp 复制代码
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.登录实现

cpp 复制代码
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.保存注册表

cpp 复制代码
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.功能演示

完整代码:

cpp 复制代码
#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.点击事件

cpp 复制代码
void DialogLogin::mousePressEvent(QMouseEvent *event)
{
    if(event->button()==Qt::LeftButton)//如果左击鼠标
    {
        this->moved=true;//开始移动
        lastPos=event->globalPos()-this->pos();//鼠标的全局位置-窗口的左上角的位置=鼠标在窗口的相对位置
    }
    return QDialog::mousePressEvent(event);//返回给父类
}

3.移动事件

cpp 复制代码
void DialogLogin::mouseMoveEvent(QMouseEvent *event)
{
    if(this->moved)//如果点击了,移动函数就启动
    {
        this->move(event->globalPos()-lastPos);//鼠标当前的全局位置减去刚刚的相对位置的距离就是窗口移动的距离
        lastPos=event->globalPos()-pos();//新的相对位置
    }
    return QDialog::mouseMoveEvent(event);
}

4.释放事件

cpp 复制代码
void DialogLogin::mouseReleaseEvent(QMouseEvent *event)
{
    this->moved=false;//松开按键就关闭移动
    return QDialog::mouseReleaseEvent(event);
}

现在我们的窗口就可以移动了,你也去试试吧,哈哈哈,记得鼠标事件加个QMouseEvent的头文件哦.

七.总结

启动窗口的玩法,用在的地方还是蛮多的,不管是为了加载资源,还是说为了登录验证,都会用到这个,因为可以是自定义的嘛,所有你们可以充分的发挥出你们的想象力!

相关推荐
waicsdn_haha11 分钟前
Java/JDK下载、安装及环境配置超详细教程【Windows10、macOS和Linux图文详解】
java·运维·服务器·开发语言·windows·后端·jdk
_WndProc13 分钟前
C++ 日志输出
开发语言·c++·算法
薄荷故人_14 分钟前
从零开始的C++之旅——红黑树及其实现
数据结构·c++
m0_7482400214 分钟前
Chromium 中chrome.webRequest扩展接口定义c++
网络·c++·chrome
biter008816 分钟前
opencv(15) OpenCV背景减除器(Background Subtractors)学习
人工智能·opencv·学习
qq_4335545422 分钟前
C++ 面向对象编程:+号运算符重载,左移运算符重载
开发语言·c++
努力学习编程的伍大侠26 分钟前
基础排序算法
数据结构·c++·算法
数据小爬虫@41 分钟前
如何高效利用Python爬虫按关键字搜索苏宁商品
开发语言·爬虫·python
ZJ_.43 分钟前
WPSJS:让 WPS 办公与 JavaScript 完美联动
开发语言·前端·javascript·vscode·ecmascript·wps
Narutolxy1 小时前
深入探讨 Go 中的高级表单验证与翻译:Gin 与 Validator 的实践之道20241223
开发语言·golang·gin