【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秒定时器结束时,会触发自动登录的操作。这样的设计可以让用户在一定时间内有机会取消自动登录,增加了用户对自动登录过程的控制。

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

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

相关文章

文字超长显示省略号...坑(如果盒子本身是弹性盒子flex布局会不支持)

如果盒子是弹性盒子 样式会失效 #item-title{font-size: 28rpx;font-weight: 800;color: #2D3748;width: 100%;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;}&:nth-child(2){width: calc(100% - 172rpx);margin-left: 40rpx;>view{&:not(:first-…

人工智能基础-Numpy矩阵运算-聚合操作

加、减、乘、除、整除 幂、取余、倒数、绝对值 三角函数 e的x次方、3的x次方、logx、log2为底、log10为底 矩阵运算 加、减、乘(对应数相乘)、矩阵相乘运算、转至 向量和矩阵的运算 加法 对应相加 改变维度后相加 乘法 矩阵的逆 聚合操作 …

Java基础数据结构之Lambda表达式

一.语法 基本语法:(parameters)->expression或者(parameters)->{statements;} parameters:类似方法中的形参列表,这里的参数是函数式接口里面的参数。这里的参数可以明确说明,也可以不声明而由JVM隐含的推断。当只有一个推…

Android View解析

一、什么是View? 1.View是用户接口组件的基本构建块; 2.View在屏幕上占据一个矩形区域; 3.View通过绘制自己与事件处理两种方式与用户交互 设计View,主要是为了让应用能够与用户交互,要想完成交互,这个…

数据探索与可视化:可视化分析数据-下

目录 一、前言 二、介绍 Ⅰ.时间序列数据 Ⅱ.文本数据 Ⅲ.社交网络数据 三、结语 一、前言 那么本篇将互怼其他类型的数据分析的可视化方法进行介绍,它们分别是:时间序列,文本数据,社交网络数据。 二、介绍 Ⅰ.时间序列数据 import pan…

【python接口自动化】- 正则用例参数化

🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 &#x1…

鸿蒙开发有必要学吗?看完这篇再决定吧

在科技的潮流中,每一次新操作系统的诞生都是对旧秩序的挑战与新机遇的孕育。鸿蒙操作系统的出现,无疑是近年来科技界最引人注目的事件之一。自华为于2019年正式推出鸿蒙系统以来,这一我们自主研发的操作系统不仅在国内引起巨大反响&#xff0…

在windows平台上mysql的安装教程

1.下载 mysql下载网址:https://dev.mysql.com/downloads/installer/ 这里直接选择的是mysql的社区版。自己使用直接选择免费的就行 直接选择下载 2.安装过程 选择Server only 就行 下一步 下一步 下一步,选择弱密码把,方便学习和自己使用 设置…

Java对象属性设置方式

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! 对象属性设置方式 直接赋值 SystemMappingCode systemMappingCode new SystemMappingCode();systemMappingCode.setCodeResp(request.getCodeResp());systemMapping…

POI操作word表格,添加单元格,单元格对齐方法(不必合并单元格)

添加单元格,直接对row进行create新的cell,则会导致新创建的单元格与前面的单元格不对齐的现象。 //表格信息XWPFTable table doc.createTable();table.setWidth("100%");//第一行XWPFTableRow row0table.getRow(0);XWPFTableCell cell00row0.…

基于Python的招聘网站爬虫及可视化的设计与实现

摘要:现在,随着互联网网络的飞速发展,人们获取信息的最重要来源也由报纸、电视转变为了互联网。互联网的广泛应用使网络的数据量呈指数增长,让人们得到了更新、更完整的海量信息的同时,也使得人们在提取自己最想要的信…

Linux - iptables 防火墙

一. 安全技术和防火墙 1.安全技术 入侵检测系统(Intrusion Detection Systems):特点是不阻断任何网络访问,量化、定位来自内外网络的威胁情况,主要以提供报警和事后监督为主,提供有针对性的指导措施和安全…

【C++游戏开发-01】推箱子

C游戏开发 文章目录 C游戏开发[TOC](文章目录) 前言一、逻辑分析1.1地图实现1.2人物的移动1.2.1小人移动1.2.2其他移动 1.3墙壁的碰撞1.4箱子的推动1.4.1什么时候推箱子1.4.2什么情况可以推箱子 1.5胜利的判断1.6卡关的处理1.7关卡的切换 二、DEMO代码2.1游戏框架2.2各功能函数…

【亲测有效】无法获得下列许可 SOLIDWORKS Standard 无效的(不一致的) 使用许可号码 (-8,544,0)

在观看本文章前,请注意看你的报错代码是否和我的一致,如果不是,直接跳过本文章。 前言:我安装的是SOLIDWORKS2022版,软件已经安装完毕,SolidWorks_Flexnet_Server文件夹里面的两个注册表已经安装完毕&#…

Python tkinter (7) ——Scale控件

Python的标准Tk GUI工具包的接口 tkinter系列文章 python tkinter窗口简单实现 Python tkinter (1) —— Label标签 Python tkinter (2) —— Button标签 Python tkinter (3) —— Entry标签 Python tkinter (4) —— Text控件 Python tkinter (5) 选项按钮与复选框 Pyt…

Stata收敛性分析(含详细代码说明和样例数据)

Stata收敛性分析(含详细代码说明和样例数据) 收敛性分析是管理科学和运筹学中重要的概念,是一种解决决策者对他们的管理策略的反馈的方式和手段。它的最终目的是帮助管理者从复杂的环境中筛选最优的解决方案。收敛性分析一般情况下会结合一些…

为客户解决痛点,电子纸增加制表功能

为客户解决痛点,电子纸增加制表功能 部分客户购买我们的电子纸后反馈效果很好,但是在配套组态软件制作电子纸模板时,遇到需要制作表格的时候比较麻烦。像是在画板作画一样,比较费时,而且效果不是很好,没办…

用VsCode写python

1.创建一个文件夹 2.创建.py文件 print("Hello World") print("*"*10) 4.运行 在终端版本fileName python3 app.py

MATLAB矩阵的操作(第二部分)

师从清风 矩阵的创建方法 在MATLAB中,矩阵的创建方法主要有三种,分别是:直接输入法、函数创建法和导入本地文件中的数据。 直接输入法 输入矩阵时要以中括号“[ ]”作为标识符号,矩阵的所有元素必须都在中括号内。 矩阵的同行元…

零基础学Python之核心基础知识

1.Python入门简介 (1)什么是Python Life is short, you need Python!人生苦短,我用Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读性,相比其他语言…