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

news2024/11/26 10:03:40

输入框小设计

目的:实现鼠标点击输入框时的聚焦效果。
首先在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.coloradmin.cn/o/1426237.html

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

相关文章

uniapp+微信小程序+nodejs问题记录

一、前言 通过uniapp进行微信小程序调试。服务端使用NodeJs。 二、报错统计 1、本地调试时微信小程序报错:request:Cannot send network request to localhost 解决方法: 【微信小程序开发平台】-【本地设置】-勾选“不校验合法域名、web-view、TLS版本…

Python完善APC netbotz 250报告功能实现主动式运维。

首先介绍一下APC netbotz 250, 这是施耐德推出的一款机架式监控主机,能够对所有IT环境进行经济有效而且灵活的监控,号称APC史上性价比最高的环境监测方案,这可不是我吹的,是APC官网的介绍,可参考下面的官网截图。 我们…

Visual Studio 2022编译错误 Error MSB8041-此项目需要MFC库解决方案

Visual Studio 2022编译错误 Error MSB8041-此项目需要MFC库 错误原因: Visual Studio 2022安装的MFC库不够。 解决方案: 安装Visual Studio 2022 需要的MFC 库就可以了。 安装方法: 第一步,打开vs2022 工具 ->获取工具和功…

数据可视化Tableau

目录 一.第一次实验课内容 1、熟悉Tableau Desktop的工作环境。 2、熟悉数据导入、维度和度量的区分以及不同数据字段类型的标识符。 3、熟悉工作表的基本操作,主要包括行列功能区,标记卡,筛选器,智能推荐的使用。 4、作业--…

两个链表的第一个重合节点

法一:蛮力法 即顺序遍历第一个链表的每个节点,每遍历到一个节点,就在第二个链表中顺序遍历每个节点,比较是否有节点相同。该方法的时间复杂度是O(mn),空间复杂度是O(1)。…

Java进击框架:Spring-综合(十)

Java进击框架:Spring-综合(十) 前言Rest ClientsWebClientRestTemplateHTTP接口 JMS (Java消息服务)使用Spring JMS发送消息接收消息注释驱动的侦听器端点 JMXEmail任务执行和调度Spring TaskExecutor 抽象Spring TaskScheduler 抽象支持调度…

cuda基础教程(一)

文章目录 0. CURA Runtime API1. CUDA人工智能编程1.1. CUDA介绍1.2. 课程内容 2. 异构计算和并行计算2.1. 什么是并行计算2.2. 什么是异构计算 3. CUDA介绍3.1. GPU的性能指标3.2. 什么是CUDA3.3. 如何学习CUDA 4. 系统GPU查询5. Linux系统6. CUDA安装7. 查询GPU信息8. CUDA编…

[C#][opencvsharp]winform实现自定义卷积核锐化和USM锐化

【锐化介绍】 图像锐化(image sharpening)是补偿图像的轮廓,增强图像的边缘及灰度跳变的部分,使图像变得清晰,分为空间域处理和频域处理两类。图像锐化是为了突出图像上地物的边缘、轮廓,或某些线性目标要素的特征。这种滤波方法…

Python机器学习:一文讲透机器学习中的验证集法

验证集法又被称为“留出法”,基本思路是将样本数据集划分为两个互斥的集合:训练集和测试集。其中训练集占比一般为2/3~4/5,常用70%;测试集占比一般为1/5~1/3,常用30%。训练集用来构建机器学习模型;测试集也…

vit细粒度图像分类(八)SIM-Trans学习笔记

1.摘要 细粒度视觉分类(FGVC)旨在从相似的从属类别中识别物体,这对人类准确的自动识别需求具有挑战性和实用性。大多数FGVC方法侧重于判别区域挖掘的注意机制研究,而忽略了它们之间的相互依赖关系和组成的整体对象结构,而这些对模型的判别信…

11. UE5 RPG使用GameplayEffect修改角色属性(二)

上一篇写了一下GameplayEffect的基础操作,这一篇进阶一下,讲解一下GameplayEffect堆叠功能,以及能够基于这个堆叠能够实现一些怎样的效果。 经过几天的查看,发现新版的更新的真不错,而且最上面竟然直接显示编译的错误…

Django部署到服务器后无法获取到静态元素 The requested resource was not found on this server

问题描述 写了一个Django项目,部署到云主机后,访问发现图片无法访问,报错The requested resource was not found on this server 图片是一个词云图,根据爬虫爬取的信息生成的,根据爬取的信息会改变,所以没…

大数据信用报告应该去哪里查询比较好呢?

对于个人而言,大数据信用报告也变得越来越重要。那么,大数据信用报告应该去哪里查询呢?本文将为您详细介绍征信和大数据的区别,并推荐一个可靠的大数据平台。 首先,我们需要了解征信和大数据的区别 征信报告 依法采集、整理、保存…

Redis主从集群

一.资源分布 操作系统:Centos 7 Redis版本:6.2.14 IP端口角色192.168.157.1306379master192.168.157.1316379slave1192.168.157.1326379slave2 二.流程 1.创建三台虚拟机IP及端口如上且安装好Reids 2.修改三个redis.conf配置文件 其它说明&#xff1a…

Modbus协议学习第六篇之基于libmodbus库的示例程序(可以联合Modbus模拟仿真软件进行调试)

前置工作 学了这么多Modbus的知识,如果不进行实际的操作,总感觉懂的不透彻。基于此, 本篇博文就带各位读者来了解下如何通过编写程序来模拟与Modbus Slave仿真软件的通讯。当然了,这里有两个前提,如下: 1.请…

printf死翘翘

本来想把我的单片机玩一下,寄给在大学搞研究的一个朋友,但竟然挂在printf里面,大概知道是什么位置出问题,但是还想不清楚什么原因。 我先是在stc51单片机里面搞了串口,然后我想用串口重定向到printf做调试,…

element-ui icon 组件源码分享

今日简单分享 element-ui 源码中的 icon 组件,主要从以下两个方面来分享: 一、源码中 icon 设计思想是什么呢?主要从页面结构、数据、 icon 样式三个方面来分享。 1.1 源码中 icon 组件的页面结构,可以在 package 目录下找到 ico…

Android 高德地图切换图层

一、默认样式 Android 地图 SDK 提供了几种预置的地图图层&#xff0c;包括卫星图、白昼地图&#xff08;即最常见的黄白色地图&#xff09;、夜景地图、导航地图、路况图层。 findViewById<TextView>(R.id.normal).setOnClickListener {updateSelectedStatus(TYPE_NORMA…

LeetCode 每日一题Day 54 - 61

2859. 计算 K 置位下标对应元素的和 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 请你用整数形式返回 nums 中的特定元素之 和 &#xff0c;这些特定元素满足&#xff1a;其对应下标的二进制表示中恰存在 k 个置位。 整数的二进制表示中的 1 就是这个整数的 置位…

Java 正则匹配sql

文章目录 正则匹配sql表名称insert intoupdate 正则表达式什么时候要加^$ 在线正则校验 正则匹配sql表名称 insert into insert into PING_TABLE (CODE, NAME) VALUES(0, 待提交),(1, 审核中),(2, 审核通过),(3, 已驳回); regex -> insert\sinto\s(\w)\s*\(?update upda…