【qt】启动窗口的玩法

启动窗口的玩法

  • 一.应用场景
  • 二.界面类设计窗口
  • 三.main中创建
  • 四.窗口显示标识
  • 五.功能实现
    • 1.读取注册表
    • 2.md5加密
    • 3.登录实现
    • 4.保存注册表
    • 5.功能演示
  • 六.鼠标事件拖动窗口
    • 1.找到鼠标事件的函数
    • 2.点击事件
    • 3.移动事件
    • 4.释放事件
  • 七.总结

一.应用场景

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

二.界面类设计窗口

在这里插入图片描述
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的头文件哦.

七.总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/695481.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB实现粒子群算法优化柔性车间调度(PSO-fjsp)

柔性车间调度是典型的N-P问题&#xff0c;数学模型如下&#xff1a; 数学模型 假设有n个工件需要在m台机器上进行加工。每个工件包含一道或多道工序&#xff0c;每道工序可以在多台机器上进行加工&#xff0c;但每道工序的加工时间随机器的不同而不同。 符号定义 n&#xf…

仓储系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;试剂管理&#xff0c;安全管理&#xff0c;存储管理 用户账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;试剂管理&#xff0c;安全管…

pytest构建和测试FastAPI CURD API

文章目录 概述目标FASTAPI 介绍CRUD API 项目设置freezepipreqs 代码介绍run APIpytest测试conftest测试用例测试报告 F&Q1.执行uvicorn app.main:app --host localhost --port 8000 --reload 报错 zsh: /usr/local/bin/uvicorn: bad interpreter2.生成requirement.txt时&a…

基于SSM+Jsp的家用电器销售网站

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

技术玩家实现在不支持的CPU上运行 Windows 10 22H2

最近&#xff0c;AMD 悄然确认&#xff0c;其新款 Ryzen AI 300 系列 APU 将不再为 Windows 10 制作芯片组驱动程序&#xff0c;因为它将终止对Windows 10操作系统的支持&#xff0c;尽管它完全有能力这样做。这意味着想要获得官方驱动程序支持的用户必须在其上运行 Windows 11…

8.让画面动起来

一、Unity Shader中的内置变量&#xff08;时间篇&#xff09; 动画效果往往都是把时间添加到一些变量的计算中&#xff0c;以便在时间变化的同时也可以随之变化。Unity shader提供了一系列关于时间的内置变量来允许我们方便地在Shader中访问运行时间&#xff0c;实现各种动画…

基于小波的多元信号降噪-基于马氏距离和EDF统计(MATLAB R2018a)

马氏距离是度量学习中一种常用的距离指标&#xff0c;通常被用作评定数据样本间的相似度&#xff0c;可以应对高维线性分布数据中各维度间非独立同分布的问题&#xff0c;计算方法如下。 &#xff08;1&#xff09;计算样本向量的平均值。 &#xff08;2&#xff09;计算样本向…

插卡式仪器模块:示波器模块(插卡式)

• 12 位分辨率 • 125 MSPS 采样率 • 支持单通道/双通道模块选择 • 可实现信号分析 • 上电时序测量 • 抓取并分析波形的周期、幅值、异常信号等指标 • 电源纹波与噪声分析 • 信号模板比对 • 无线充电&#xff08;信号解调&#xff09; 通道12输入阻抗Hi-Z, 1 MΩ…

物联网实战--平台篇之(十四)物模型(用户端)

目录 一、底层数据解析 二、物模型后端 三、物模型前端 四、数据下行 本项目的交流QQ群:701889554 物联网实战--入门篇https://blog.csdn.net/ypp240124016/category_12609773.html 物联网实战--驱动篇https://blog.csdn.net/ypp240124016/category_12631333.html 物联网…

LLM技术

LLM 是利用深度学习和大数据训练的人工智能系统&#xff0c;专门设计来理解、生成和回应自然语言。这些模型通过分析大量的文本数据来学习语言的结构和用法&#xff0c;从而能够执行各种语言相关任务。以 GPT 系列为代表&#xff0c;LLM 以其在自然语言处理领域的卓越表现&…

表达式求值的相关语法知识(C语言)

目录 整型提升 整型提升的意义 整型提升规则 整型提升实例 算术转换 赋值转换 操作符的属性 C语言的语法并不能保证表达式的执行路径唯一&#xff01;&#xff01;&#xff01; 问题表达式 整型提升 C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这…

JavaScript 动态网页实例 —— 图像运动与事件

除图像显示外,图像运动和对事件的响应也是常见的图像效果。本章介绍图像的运动与图像对事件的响应。其中,图像事件包括:图像的拖动、按钮控制图像的显示、图像感应鼠标等;图像运动包括:图像的滑动、图像的花环效果、图像的流星效果、图像的逐渐变大、图像分块飞行和图像分条飞…

window wsl2的ubuntu如何配置代理获取docker image

最近两天&#xff0c;docker pull一直下不来docker image, 研究了下可以通过代理pull, 我的是window电脑下的linux子系统wsl2, 装的是ubuntu跑docker. # 创建/etc/systemd/system/docker.service.d路径 sudo mkdir -p /etc/systemd/system/docker.service.d # 创建 http-proxy…

借助ChatGPT快速仿写一篇优质论文,无痛仿写、完美创作

大家好&#xff0c;感谢关注。我是七哥&#xff0c;一个在高校里不务正业&#xff0c;折腾学术科研AI实操的学术人。可以添加我&#xff08;yida985&#xff09;交流学术写作或ChatGPT等AI领域相关问题&#xff0c;多多交流&#xff0c;相互成就&#xff0c;共同进步 在学术写…

汽车数据应用构想(三)

上期说的&#xff0c;用数据去拟合停车信息的应用&#xff0c;那么类似的POI信息相关的场景其实都可以实现。今天讲讲用户使用频率也很高的加油/充电场景。 实际应用中&#xff0c;在加油场景中用户关心的通常还是价格。无论是导航还是各种加油APP/小程序&#xff0c;都已经很…

【云岚到家】-day02-1-区域服务后续开发及完善

【云岚到家】-day02-1-区域服务后续开发及完善 1 区域服务后续开发1.1 添加区域服务1.1.1 接口定义1.1.1.1 接口设计1.1.1.2 接口定义-json 1.1.2 接口开发1.1.2.1 mapper1.1.2.2 service1.1.2.3 controller 1.1.3 测试 1.2 修改价格1.2.1 接口定义1.2.1.1 接口设计1.2.1.2 接口…

Git发布正式

一般我们开发都是在测试环境开发&#xff0c;开发完成后再发布到正式环境。 一.分支代码合并到主分支1.首先切换到自己的分支(比如分支叫&#xff1a;dev)git checkout dev2.把本地分支拉取下来git pull 或者 git pull origin dev3.切换到主分支mastergit checkout master4.更新…

地图商家数据怎么查看?揭秘采集软件工作原理!

地图商家数据怎么查看&#xff1f;其实主要就是两种方法&#xff1a; 1. 直接使用地图服务提供的API&#xff1a;大多数地图提供商&#xff08;如Google地图&#xff0c;百度地图等&#xff09;都会提供一些API&#xff0c;通过这些API&#xff0c;可以获取到它们所拥有的商家…

FlashBrowser

本例&#xff1a;windows10 下载FlashBrowser 解决flash失效问题&#xff0c;更换浏览器 https://www.flash.cn/ 下载FlashBrowser浏览器