【Qt加密播放器】登录窗口功能补充

输入框小设计

目的:实现鼠标点击输入框时的聚焦效果。
首先在LoginForm构造函数中为账号和密码输入框添加事件过滤器。关于事件过滤器的具体介绍可以参考这篇博文:Qt消息机制和事件

ui->nameEdit->installEventFilter(this);
ui->pwdEdit->installEventFilter(this);

在eventFilter()中实现:

  1. 当鼠标点击输入框时,即event->type() == QEvent::FocusIn时,将输入框的字体颜色变深
  2. 当不输入时,若输入框中无内容,则将输入框字体颜色变浅
bool LoginForm::eventFilter(QObject* watched, QEvent* event)
{if(ui->passwdEdit == watched){if(event->type() == QEvent::FocusIn){ui->passwdEdit->setStyleSheet("color: rgb(1,1,1);background-color: transparent;");}else if(event->type() == QEvent::FocusOut){if(ui->passwdEdit->text().size() == 0){ui->passwdEdit->setStyleSheet("color: rgb(158,158,158);background-color: transparent;");}}}else if(ui->nameEdit == watched){if(event->type() == QEvent::FocusIn){ui->nameEdit->setStyleSheet("color: rgb(1,1,1);background-color: transparent;");}else if(event->type() == QEvent::FocusOut){if(ui->nameEdit->text().size() == 0){ui->nameEdit->setStyleSheet("color: rgb(158,158,158);background-color: transparent;");}}}return QWidget::eventFilter(watched, event);
}

最终记得返回原有的事件过滤函数 ,以便在处理完自定义过滤器逻辑后,将其余事件传递给父类处理。

实现效果:

  1. 未点击输入框时,字体颜色较浅。
    在这里插入图片描述
  2. 点击输入框,字体颜色变深,实现聚焦效果。
    在这里插入图片描述
  3. 输入内容时,默认占位文本消失,变成用户输入内容
    在这里插入图片描述
    (关于默认占位文本为何会消失这一点,是QWidget类的成员函数setPlaceholderText()本身实现的。在上篇博文中我们使用setPlaceholderText()函数为输入框添加了默认占位文本,占位文本通常会在用户在输入框中未输入任何内容时显示,一旦用户开始输入内容,占位文本就会自动消失。)

添加忘记密码功能

首先添加一个文字内容为“忘记密码”的QLabel,设置名称为forget
在这里插入图片描述
forget添加事件过滤器

    ui->forget->installEventFilter(this);

eventFilter()函数中实现对forget按下事件的处理

 if((ui->forget == watched) && (event->type() == QEvent::MouseButtonPress)){QDesktopServices::openUrl(QUrl(QString(HOST) + "/forget"));}return QWidget::eventFilter(watched, event);

当点击forget之后,会跳转到对应的处理网页。

关于QDesktopServices的介绍
QDesktopServices是Qt桌面服务类,它提供了一些方便的方法来访问桌面相关的功能。主要包括文件操作、URL打开、电子邮件发送等功能。

  • 打开URL
QDesktopServices::openUrl(QUrl("http://www.example.com"));

这段代码可以用来在用户的系统默认浏览器中打开指定的URL。

  • 打开文件
QDesktopServices::openUrl(QUrl::fromLocalFile("/path/to/your/file.txt"));

这段代码可以用来在系统中打开指定的文件。系统会使用默认的关联程序打开该文件。

  • 发送邮件
QDesktopServices::openUrl(QUrl("mailto:recipient@example.com?subject=Hello&body=Hello%20there"));

这段代码可以用来打开默认的邮件客户端,并创建一个新的邮件写作窗口,填充收件人邮箱、主题和正文。

添加记住密码功能

添加一个文字为“记住密码”的CheckBox,命名为remberPwd
在这里插入图片描述
在RecordFile的构造函数中,为m_config添加字段"remember",初始值为false。

m_config.insert("remember", false);//记住密码

在UI中右键checkBox,选择转到槽,选择重写状态改变stateChanged()函数:
在这里插入图片描述

当checkBox的状态变化时,如果 “记住密码” 复选框被勾选,将用户名和密码保存到持久化存储中。(在后续博文实现)
如果取消勾选,则会删除保存的用户名和密码,同时取消自动登录。
取消自动登录功能将在下文介绍。

void LoginForm::on_remberPwd_stateChanged(int state)
{//记住密码复选框状态改变record->config()["remember"] = state == Qt::Checked;if(state == Qt::Checked&&){QString user = ui->nameEdit->text(); // 获取用户名输入框中的文本QString pwd = ui->pwdEdit->text(); // 获取密码输入框中的文本saveCredentials(user, pwd); // 将用户名和密码保存到持久化存储中is_remembered=true;}else{is_remembered=false;clearSavedCredentials(); // 清除保存的用户名和密码ui->autoLoginCheck->setChecked(false);//关闭记住密码,则取消自动登录}
}

从持久化存储中加载已保存的用户名和密码,并将其加载到输入框中。

void LoginForm::loadSavedCredentials()
{QString user, pwd;if(hasSavedCredentials(user, pwd)) // 检查是否存在已保存的用户名和密码{ui->nameEdit->setText(user); // 将已保存的用户名填充到用户名输入框中ui->pwdEdit->setText(pwd); // 将已保存的密码填充到密码输入框中}
}

on_logoButton_released()做如下修改。
若上一次登录已经记住密码,则加载记录中的账户密码。
获取输入框中的内容,若记住密码复选框被勾选,并且上一次没有记录密码(! is_remembered),则保存用户名和密码。

void LoginForm::on_logoButton_released()
{if(is_remembered) loadSavedCredentials();QString user = ui->nameEdit->text(); // 获取用户名输入框中的文本QString pwd = ui->pwdEdit->text(); // 获取密码输入框中的文本bool rememberPwd = ui->remberPwd->isChecked(); // 获取 "记住密码" 复选框的状态if(rememberPwd&&!is_remembered){saveCredentials(user, pwd); // 如果 "记住密码" 被勾选,保存用户名和密码}// 其他登录操作...
}

添加自动登录功能

添加“自动登录”CheckBox,命名autoLoginCheck。
在这里插入图片描述
在RecordFile的构造函数中,为m_config添加字段"auto",初始值为false。

m_config.insert("auto", false);//自动登录

当“自动登录”复选框状态变化时:

  • 根据 “自动登录” 复选框的状态更新配置信息中的 “auto” 字段,如果状态为 Qt::Checked,则设置 “auto” 字段为 true;否则设置为 false。
  • 当 “自动登录” 被勾选时,将执行以下操作:
    • 设置 “remember” 字段为 true,表示开启自动登录时会同时开启记住密码。
    • 将 “记住密码” 复选框设置为勾选状态,保证自动登录时也会记住密码。
    • 禁止用户修改 “记住密码” 复选框的状态。
  • 当 “自动登录” 被取消勾选时,将执行以下操作:
    • 允许用户修改 “记住密码” 复选框的状态。
void LoginForm::slots_autoLoginCheck_stateChange(int state)
{record->config()["auto"] = state == Qt::Checked;if(state == Qt::Checked){record->config()["remember"] = true;ui->remberPwd->setChecked(true);//自动登录会开启记住密码}else{ui->remberPwd->setCheckable(true);//启动修改状态}
}

load_config()函数

用于加载用户配置信息并初始化界面状态的,并且根据配置信息来自动设置 “记住密码” 和 “自动登录” 复选框的状态,以及相应的用户名和密码输入框的文本内容。
在LoginForm构造函数的最后调用

connect(ui->autoLoginCheck, SIGNAL(stateChanged(int)),this, SLOT(slots_autoLoginCheck_stateChange(int)));

当 “自动登录” 复选框的状态改变时,会调用名为slots_autoLoginCheck_stateChange的槽函数来处理状态改变。这样做是为了确保复选框状态的改变能够触发相应的处理逻辑。

QJsonObject& root = record->config();

从记录中获取用户的配置信息,并存储在 root 中。

ui->remberPwd->setChecked(root["remember"].toBool());
ui->autoLoginCheck->setChecked(root["auto"].toBool());

根据配置信息中的 “remember"和"auto” 字段的值来设置 “记住密码” 复选框的状态。

if(root["auto"].toBool()) //如果开启了自动登录,则检查用户名和密码是否ok
{if(user.size() > 0 && pwd.size() > 0){ui->nameEdit->setText(user);ui->pwdEdit->setText(pwd);ui->logoButton->setText(u8"取消自动登录");auto_login_id = startTimer(3000);//给3秒的时间,方便用户终止登录过程}
}

如果用户和密码都存在,会设置登录按钮的文本为 “取消自动登录”,表示可以取消自动登录。
启动一个 3 秒的定时器 (auto_login_id = startTimer(3000)),以便用户在登录过程中能够在 3 秒内取消自动登录的操作。

定时器

当定时器结束时,会触发timerEvent()函数来处理定时器事件。
重写timeEvent()函数,处理自动登录定时器事件的逻辑。一旦定时器触发,会从记录中获取用户的配置信息,然后使用配置的用户名和密码进行登录检查。

void LoginForm::timerEvent(QTimerEvent* event)
{if(event->timerId() == auto_login_id){killTimer(auto_login_id);QJsonObject& root = record->config();QString user = root["user"].toString();QString pwd = root["password"].toString();check_login(user, pwd);}
}

实现了当3秒定时器结束时,会触发自动登录的操作。这样的设计可以让用户在一定时间内有机会取消自动登录,增加了用户对自动登录过程的控制。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常用换源总结

1.Ubuntu16.04更换国内源 在Ubuntu系统上使用apt-get install进行软件安装或更新的时候,由于使用的是国外源,导致下载速度很慢或者连接超时,需要更换下载源。 1.将系统原始的源文件进行备份 sudo cp /etc/apt/sources.list /etc/apt/source…

docker踩坑记录

踩坑记录 1.1 后台启动容器,实际没有启动 现象: 后台启动centos,结果执行docker ps命令,容器没启动。 原因: docker是以容器启动的,必须要有个前台进程,若是全部都是后台deamon守护进程&…

ChatGPT实战100例 - (12) 结构化提示词 LangGPT 实战

文章目录 ChatGPT实战100例 - (12) 结构化提示词 LangGPT 实战一、LangGPT是什么?二、远古诗人 vs 现代诗人三、LangGPT Role模板实战 - 甩锅王Role模板特征提取四、 用AI实现提示词结构化ChatGPT实战100例 - (12) 结构化提示词 LangGPT 实战 一、LangGPT是什么? 随着大模型…

代码随想录算法训练营第42天 | 01背包问题,你该了解这些! 01背包问题,你该了解这些! 滚动数组 416. 分割等和子集

目录 01背包问题,你该了解这些! 01 背包 二维dp数组01背包 💻实现代码 01背包问题,你该了解这些! 滚动数组 一维dp数组(滚动数组) 💻实现代码 416. 分割等和子集 &#x1f…

前后端数据校验

前端校验内容 前端开发中的必要校验,可以保证用户输入的数据的准确性、合法性和安全性。同时,这些校验也有助于提供良好的用户体验和防止不必要的错误提交到后端。 1、必填字段校验: 对于必填的字段,需确保用户输入了有效的数据…

二叉树可视化

二叉树可视化 运行演示代码和程序已上传二叉树知识平衡二叉树红黑树最优二叉搜索树哈夫曼树KD树B树和B树 参考 运行演示 学习二叉树总是脑补图像,实在是恶心,就想写一个能可视化的二叉树,结果没控制好,功能越想越多,先…

红日三打靶!!!

红日三,黑盒测试 环境搭建一.外网打点1.网段探测2.端口服务扫描3.目录扫描4.网站漏洞扫描5.汇总,找破绽6.登陆MySQL改密码 7.进入后台,找能写马的地方8.蚁剑连接9.disable_functions绕过1.蚁剑插件绕过2.bypass_disablefunc_via_LD_PRELOAD绕…

Django模型(四)

一、数据操作初始化 from django.db import models# Create your models here. class Place(models.Model):"""位置信息"""name = models.CharField(max_length=32,verbose_name=地名)address = models.CharField(max_length=64,null=True,verbo…

利用OpenCV实现物流与生产线自动化的革命性突破

背景介绍: 在当今高度自动化的时代,物流和生产线上的每一个环节都关乎企业的核心竞争力。传统的生产方式往往依赖于人工检测和操作,这不仅效率低下,而且容易出错。为了解决这一问题,越来越多的企业开始寻求利用计算机视…

【高阶数据结构】红黑树

文章目录 前言什么是红黑树红黑树的性质红黑树结点的定义红黑树的插入情况一情况二情况三插入代码总结 验证是否为红黑树红黑树的删除 前言 前面我们学习了 AVL 树——高度平衡的二叉搜索树,AVL 树保证了结点的左右子树的高度差的绝对值不超过 1,也就是…

【正点原子STM32】STM32时钟系统(时钟树、时钟源、分频器和倍频系数、锁相环、STM32CubeMX时钟树、系统时钟配置步骤)

一、认识时钟树 1.1、什么是时钟?1.2、认识时钟树(F1)1.3、认识时钟树(F4)1.4、认识时钟树(F7)1.5、认识时钟树(H7) 二、配置系统时钟 2.1、系统时钟配置步骤2.2、外设…

绝世唐门:霍挂六个十万年魂环,一穿七灭团再现,淘汰赛顺利晋级

Hello,小伙伴们,我是拾荒君。 国漫《斗罗大陆2绝世唐门》第32期超前爆料,霍雨浩开局便释放六个十万年魂环,以绝对的气场碾压天灵学院代表队。首次参与高级魂师大赛,霍雨浩便大放异彩秀出超级霍挂,此等操作就连当初的唐…

如何修复鼠标不工作的问题?这里提供几个方法

如果你的鼠标无法连接到你的电脑,或者只能间歇性工作,那就是一个问题。你需要买一个新的吗?不一定。虽然换个便宜的无线鼠标很容易,但在你花钱买一款符合人体工程学的新鼠标或游戏鼠标之前,有一些事情需要尝试。 检查电源 像任何其他外设一样,鼠标需要电源。许多鼠标上都…

人口增长问题 T1063

#include<bits/stdc.h> using namespace std; int main(){int n;double x;cin>>x>>n;for(int i1;i<n;i){xx*1.001;}printf("%.4lf",x);return 0; }

【lesson35】基础IO之fd周边问题

文章目录 基础IO要讲的知识点介绍fd周边问题 基础IO要讲的知识点介绍 1.复习一下C语言的接口 2.直接使用系统接口 3.分析系统接口的细节&#xff0c;引入fd&#xff08;文件描述符&#xff09; 4.fd的周边问题&#xff08;fd的理解、fd和file的关系、fd分配规则、fd重定向…&a…

【数据结构】并查集(路径压缩)

文章目录 并查集1.朴素版本2.路径压缩3.按秩合并4.启发式合并5.练习题 并查集 1.朴素版本 1. 并查集解决的是连通块的问题&#xff0c;常见操作有&#xff0c;判断两个元素是否在同一个连通块当中&#xff0c;两个非同一连通块的元素合并到一个连通块当中。 并查集和堆的结构…

Unity 图片不改变比例适配屏幕

Unity 图片不改变比例适配屏幕 前言项目场景布置代码编写添加并设置脚本效果 前言 遇到一个要让图片适应相机大小&#xff0c;填满屏幕&#xff0c;但不改变图片比例的需求&#xff0c;记录一下。 项目 场景布置 代码编写 创建AdaptiveImageBackground脚本 using System.C…

ConcurrentModificationException异常原因,解决方法,线程安全的单例模式

异常简介 ConcurrentModificationException&#xff08;并发修改异常&#xff09;是基于java集合中的 快速失败&#xff08;fail-fast&#xff09; 机制产生的&#xff0c;在使用迭代器遍历一个集合对象时&#xff0c;如果遍历过程中对集合对象的内容进行了增删改&#xff0c;…

Fink CDC数据同步(二)MySQL数据同步

1 开启binlog日志 2 数据准备 use bigdata; drop table if exists user;CREATE TABLE user(id INTEGER NOT NULL AUTO_INCREMENT,name VARCHAR(20) NOT NULL DEFAULT ,birth VARCHAR(20) NOT NULL DEFAULT ,gender VARCHAR(10) NOT NULL DEFAULT ,PRIMARY KEY(id) ); ALTER TA…

刘知远团队大模型技术与交叉应用L6-基于大模型文本理解和生成介绍

介绍 NLP的下游运用可以分为&#xff1a;NLU(理解)和NLG(生成) 信息检索&#xff1a;NLU 文本生成&#xff1a;NLG 机器问答&#xff1a;NLUNLG 大模型在信息检索 大模型在机器问答 大模型在文本生成 信息检索-Information Retrieval (IR) 背景 谷歌搜索引擎目前同时集成了…