Qt从入门到入土(七)-实现炫酷的登录注册界面(下)

news2025/1/4 13:19:29

前言

Qt从入门到入土(六)-实现炫酷的登录注册界面(上)主要讲了如何使用QSS样式表进行登录注册的界面设计,本篇文章将介绍如何对登录注册界面进行整体控件的布局,界面的切换以及实现登录、记住密码等功能。

创建登录页面

QWidget *Dialog::createLoginPage()
{
    QWidget* w=new QWidget(this);
    m_usernameEdit=new QLineEdit();
    m_passwordEdit=new QLineEdit();
    m_remPswChk=new QCheckBox("记住密码");
    m_goRgeBtn=new QPushButton("没有账号?去注册");
    m_loginBtn=new QPushButton("登 录");
    //水平布局
    QHBoxLayout* hlayout=new QHBoxLayout();
    hlayout->addWidget(m_remPswChk);
    hlayout->addWidget(m_goRgeBtn);
    //垂直布局
    QVBoxLayout* vlayout=new QVBoxLayout(w);
    vlayout->addWidget(m_usernameEdit);
    vlayout->addWidget(m_passwordEdit);
    vlayout->addLayout(hlayout);
    vlayout->addWidget(m_loginBtn);
    return w;
}

初始化登录页面

//创建登录页面
QWidget* loginPage=createLoginPage();
loginPage->setParent(this);

//移动登录页面到合适位置
loginPage->move(462,185);

创建注册页面

QWidget *Dialog::createRegPage()
{
    QWidget* w=new QWidget;
    m_reg_usernameEdit=new QLineEdit;
    m_reg_pwdEdit=new QLineEdit;
    m_reg_rePwdEdit=new QLineEdit;
    m_goLoginBtn=new QPushButton("去登陆");
    m_regBtn=new QPushButton("注 册");

    //水平布局
    QHBoxLayout* hlayout=new QHBoxLayout;
    hlayout->addWidget(m_goLoginBtn);
    hlayout->addWidget(m_regBtn);

    //垂直布局
    QVBoxLayout* vlayout=new QVBoxLayout(w);
    vlayout->addWidget(m_reg_usernameEdit);
    vlayout->addWidget(m_reg_pwdEdit);
    vlayout->addWidget(m_reg_rePwdEdit);
    vlayout->addLayout(hlayout);

    return w;
}

初始化注册页面

//创建注册页面
QWidget* regPage=createRegPage();
regPage->setParent(this);
regPage->move(462,185);

堆栈窗口

使用QStackedWidget来存放登录和注册页面从而方便实现交互

//创建堆栈窗口
QStackedWidget* stackWidget=new QStackedWidget(this);
stackWidget->addWidget(createLoginPage());  //默认是这个窗口
stackWidget->addWidget(createRegPage());
stackWidget->setGeometry(455,150,200,240);

登录和注册页面交互

//与登录页面建立联系
connect(m_goLoginBtn,&QPushButton::clicked,[this]()
        {
            this->m_stk->setCurrentIndex(0);  //设置当前堆栈窗口索引
        });

//与注册页面建立联系
connect(m_goRgeBtn,&QPushButton::clicked,[this]()
        {
    this->m_stk->setCurrentIndex(1);  //设置当前堆栈窗口索引
       });

当前效果

到这一步整个登录注册界面基本上就已经完成了,接下来就是进行界面的美化操作。

登录注册页面美化

在QSS中对控件进行美化

美化文本框

qss中设置无边框文本框

QLineEdit
{
border:none;
border-bottom-width:1px;
border-bottom-color:rgb(223,223,223);
border-bottom-style:solid;
font-size:14px;
height:40px;
}

QLineEdit:hover
{
border-bottom-color:rgb(127,127,127);
}

设置文本提示

//设置文本提示
m_usernameEdit->setPlaceholderText("用户名");
m_passwordEdit->setPlaceholderText("密码");

//设置文本提示
m_reg_usernameEdit->setPlaceholderText("用户名");
m_reg_pwdEdit->setPlaceholderText("密码");
m_reg_rePwdEdit->setPlaceholderText("确认密码");

效果

设置对象名

设置对象名,便于在qss中对指定控件特殊化处理

//设置对象名
m_goLoginBtn->setObjectName("goLoginBtn");
m_regBtn->setObjectName("regBtn");

m_goRgeBtn->setObjectName("goRgeBtn");
m_remPswChk->setObjectName("remPswChk");
m_loginBtn->setObjectName("loginBtn");

美化复选框

QCheckBox
{
color:rgb(127,127,127);
}

QCheckBox:hover
{
color:rgb(120,45,255);
}

QCheckBox::indicator
{
border-image:url(":/Resources/images/uncheck.png");
}

QCheckBox::indicator:checked
{
border-image:url(":/Resources/images/check.png");
}

美化按钮

美化登录界面按钮

美化去注册按钮

QPushButton#goRgeBtn
{
border:none;
color:rgb(127,127,127);
}

QPushButton#goRgeBtn:hover
{
border:none;
color:rgb(120,45,255);
}

美化登录按钮

QPushButton#loginBtn
{
border:none;
border-radius:5px;
/*线性渐变*/
background:qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(11,194,255), stop:1 rgb(0,182,250));
font-size:14px;
color:white;
height:30px;
}

QPushButton#loginBtn:hover
{
 background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(34,203,255), stop:1 rgb(26,194,251));
}

美化注册界面按钮

设置水平布局两控件间隔为0

hlayout->setSpacing(0);

qss对去登陆和注册按钮控件的美化

QPushButton#goLoginBtn,#regBtn
{
border:none;
color:white;
font-size:12px;
height:30px;
}
QPushButton#goLoginBtn
{
border-top-left-radius:5px;
background:rgb(255,58,5);
width:120px;
}

QPushButton#goLoginBtn:hover
{
background:rgb(227,0,0);
}

QPushButton#regBtn
{
border-bottom-right-radius:5px;
background:rgb(6,255,238);
}

QPushButton#regBtn:hover
{
background:rgb(5,227,212);
}

响应登录和注册

使用QLabel来设置登录注册提示(登录注册失败、登录注册成功、账号密码输入错误等等)

初始化提示标签

//初始化提示标签
m_tipLab=new QLabel(this);
//设置位置
m_tipLab->setGeometry(454,375,200,30);
//设置居中显示
m_tipLab->setAlignment(Qt::AlignCenter)
//设置颜色
m_tipLab->setStyleSheet("color:red;");

初始化定时器

主要为了实现提示信息过段时间消失

//初始化定时器
m_timer=new QTimer(this);
//设置定时器结束
m_timer->callOnTimeout([this](){
    m_tipLab->clear();
    m_timer->stop();
});

提示信息函数

void Dialog::setTipMsg(const QString &msg, int msec)
{
    m_tipLab->setText(msg);
    //判断是否连续点击
    if(m_timer->isActive())
        m_timer->stop();
    m_timer->start(msec);
}

设置密码掩膜

//设置密码掩膜
m_reg_pwdEdit->setEchoMode(QLineEdit::Password);
m_reg_rePwdEdit->setEchoMode(QLineEdit::Password);

m_passwordEdit->setEchoMode(QLineEdit::Password);

登录与注册响应函数

void Dialog::onLogin()
{
    //账号密码检查
    auto username=m_usernameEdit->text();
    auto password=m_passwordEdit->text();

    if(username.isEmpty()||password.isEmpty())
    {
        setTipMsg("账号或密码不能为空!");
        return;
    }
    if(username.size()<5)
    {
        setTipMsg("账号长度有误!");
        return;
    }
    if(password.size()<8)
    {
        setTipMsg("密码长度有误!");
        return;
    }
}

void Dialog::onRegister()
{
    //账号密码检查
    auto username=m_reg_usernameEdit->text();
    auto password=m_reg_pwdEdit->text();
    auto rePsw=m_reg_rePwdEdit->text();

    if(username.isEmpty()||password.isEmpty())
    {
        setTipMsg("账号或密码不能为空!");
        return;
    }
    if(username.size()<5)
    {
        setTipMsg("账号长度有误!");
        return;
    }
    if(password.size()<8)
    {
        setTipMsg("密码长度有误!");
        return;
    }
    if(password!=rePsw)
    {
        setTipMsg("两次密码输入不一致!");
        return;
    }

}

把登录按钮设为焦点

本程序默认关闭按钮是焦点,也就是说按下回车登录界面就会关闭,所以应该要把登录按钮设置为焦点。

//取消焦点
closeBtn->setFocusPolicy(Qt::NoFocus);

//取消焦点
m_goRgeBtn->setFocusPolicy(Qt::NoFocus);
//设置焦点
m_loginBtn->setDefault(true);

登录成功后进入主界面

//账号密码与设定一致时
if(username=="admin"&&password=="admin")
    this->accept();

//登录

{
    Dialog w;
    auto ret=w.exec();
    if(ret!=QDialog::Accepted)
        return 0;
}
//登录成功进入主窗口
QWidget homeW;
homeW.show();

保存登录成功的账号密码到应用程序

qApp->setProperty("username",username);
qApp->setProperty("password",password);

qInfo()<<qApp->property("username")<<qApp->property("password");

实现记住密码以及保存账号和密码到指定文件

设置应用程序名

qApp->setApplicationName("LogRegAPP");

使用QSettings来存储和访问应用程序的设置和配置

QSettings settings(filepath,QSettings::Format::IniFormat);
//setValue方法用于将键值对存储到配置文件中
settings.setValue("remPswChk",m_remPswChk->isChecked());
settings.setValue("username",username);
settings.setValue("password",password);

使用QStandardPaths来获取应用程序本地数据位置路径

auto path=QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation);

生成配置文件路径

QString configPath()
{
    //如果成功则返回到本地应用程序位置路径,否则返回当前文件夹
    auto path=QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation);
    QDir dir;
    if(dir.mkpath(path))
    {
        if(dir.cd(path))
        {
            return dir.path()+"/"+"LogRegAPP.ini";
        }
    }
    return "LogRegAPP.ini";
}

读取配置文件中的信息

//获取配置文件中的信息
QSettings settings(configPath(),QSettings::Format::IniFormat);
//如果settings.value()返回的值不是空,它将被转换为true,否则为false。
m_remPswChk->setChecked(settings.value("remPswChk",false).toBool());
//如果找不到该设置,它将默认为一个空字符串""。
m_usernameEdit->setText(settings.value("username","").toString());
if (m_remPswChk->isChecked()) {
    m_passwordEdit->setText(settings.value("password", "").toString());
}

整体效果

点击记住密码,当每次登录完成后,下次登陆就会自动从配置文件中读取信息填写账号密码,到这里,这个项目就大体完成了,但还是有需要完善的地方,如账号密码安全性、支持多个账号等等,后续有时间会继续完善的。

总结

本次登录注册项目,涉及到了qss界面设计和美化、图形界面绘制、控件布局设计以及一些实际功能的逻辑算法,对于初学者来说是非常友好的,是一个适合入门的项目。但还不够完美,有待进一步的完善。文笔不好请见谅,要是有问题欢迎在评论区留言或者私信我,也欢迎指出我的不足,感谢观看。

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

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

相关文章

【阅读笔记】《基于区间梯度的联合双边滤波图像纹理去除方法》

一、联合双边滤波背景 联合双边滤波&#xff08;Joint Bilateral Filter, JBF&#xff09;是一种图像处理技术&#xff0c;它在传统的双边滤波&#xff08;Bilateral Filter, BF&#xff09;基础上进行了改进&#xff0c;通过引入一个引导图&#xff08;guidance image&#x…

Dockerfile基础指令

1.FROM 基于基准镜像&#xff08;建议使用官方提供的镜像作为基准镜像&#xff0c;相对安全一些&#xff09; 举例&#xff1a; 制作基准镜像&#xff08;基于centos:lastest&#xff09; FROM cenots 不依赖于任何基准镜像 FROM scratch 依赖于9.0.22版本的tomcat镜像 FROM…

Linux实验报告9-进程管理

目录 一&#xff1a;实验目的 二&#xff1a;实验内容 (1)列出当前系统中的所有进程,如何观察进程的优先级? (2)查看当前终端运行的 bash 进程的 PID,在当前终端启动 vim 编辑器并让其在后台执行,然后列出在当前终端中执行的进程的家族树。 (3)请自行挂载U盘或光盘,然后…

活动预告 |【Part1】Microsoft Azure 在线技术公开课:数据基础知识

课程介绍 参加“Azure 在线技术公开课&#xff1a;数据基础知识”活动&#xff0c;了解有关云环境和数据服务中核心数据库概念的基础知识。通过本次免费的介绍性活动&#xff0c;你将提升在关系数据、非关系数据、大数据和分析方面的技能。 活动时间&#xff1a;01 月 07 日…

笔记本电脑驱动下载并安装

自己的电脑是鸡哥家的&#xff0c;经常出现没有声音、炸麦、麦克风没有音频输入等问题 最快的解决办法就是更新驱动 但是现在市面上好多驱动检测安装软件都已经开始收费了&#xff08;xx人生、xx精灵&#xff09;很恶心 所以不妨自己寻找驱动并重新安装 1.驱动下载 最好是去…

手机实时提取SIM卡打电话的信令声音-双卡手机来电如何获取哪一个卡的来电

手机实时提取SIM卡打电话的信令声音 --双卡手机来电如何获取哪一个卡的来电 一、前言 前面的篇章《手机实时提取SIM卡打电话的信令声音-智能拨号器的双SIM卡切换方案》中&#xff0c;我们论述了局域网SIP坐席通过手机外呼出去时&#xff0c;手机中主副卡的呼叫调度策略。 但…

人工智能及深度学习的一些题目(二)

1、【单选题】 不属于语音识别预处理的步骤是哪个&#xff1f; 去重 2、HSV&#xff0c;H是色调&#xff0c;S是饱和度&#xff0c;V是亮度。 3、【填空题】 语音信号预处理中&#xff08; 预加重 &#xff09;的目的是为了对语音的高频部分进行加重&#xff0c;去除口唇辐射的…

关于今天发现的一个bug

一个输入框&#xff0c;定义只能输入0-100的数字 经过测试没有问题。 在回归的时候偶然发现&#xff0c;在输入数字7&#xff0c;点击保存以后&#xff0c;再次打开&#xff0c;发现竟然显示 经过查资料发现&#xff1a; // 关于js失精算法你都遇到哪些&#xff0c;让我们一起来…

力扣-数据结构-7【算法学习day.78】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;建议灵神的题单和代码随想录&#xff09;和记录自己的学习过程&#xff0c;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关…

oscp备战系列-Kioptrix2014

文章目录 一、信息收集二、漏洞探测三、漏洞利用四、后渗透 一、信息收集 主机探测 nmap 192.168.30.0/24 -sP端口及版本探测 nmap 192.168.30.199 -sV可以看到开放了80&#xff0c;8080端口&#xff0c;采用apache 2.2.21 mod_ssl2.2.21 openssl0.9.8q WebDAV2 php5.3.8 O…

SonarQube相关的maven配置及使用

一、maven 全局配置 <settings><pluginGroups><pluginGroup>org.sonarsource.scanner.maven</pluginGroup></pluginGroups><profiles><profile><id>sonar</id><activation><activeByDefault>true</acti…

mac系统vsCode中使用Better Comments在.vue文件里失效

问题&#xff1a;关于Better Comments默认在html、TS、JS中有效&#xff0c;在vue中无效,需要单独进行配置 windows系统可以参考友链Better Comments&#xff08;注释高亮&#xff09;在vue文件里失效的问题 关于Better Comments电脑的配置路径&#xff1a; Windows系统&…

Maven项目中不修改 pom.xml 状况下直接运行OpenRewrite的配方

在Java 的Maven项目中&#xff0c;可以在pom.xml 中配置插件用来运行OpenRewrite的Recipe&#xff0c;但是有一些场景是希望不修改pom.xml 文件就可以运行Recipe&#xff0c;比如&#xff1a; 因为不需要经常运行 OpenRewrite&#xff0c;所以不想在pom.xml 加入不常使用的插件…

命令行之巅:Linux Shell编程的至高艺术(上)

文章一览 前言一、shell概述1.1 shell的特点和类型1.1.1 **shell的特点&#xff1a;**1.1.2 常用shell类型 1.2 shell脚本的建立和执行1.2.1 建立shell脚本1.2.2 执行shell脚本的方式1.2.3 shell程序实例 二、shell变量与算数运算2.1 简单shell变量2.1.1 简单变量定义和赋值2.1…

深度学习:基于MindSpore NLP的数据并行训练

什么是数据并行&#xff1f; 数据并行&#xff08;Data Parallelism, DP&#xff09;的核心思想是将大规模的数据集分割成若干个较小的数据子集&#xff0c;并将这些子集分配到不同的 NPU 计算节点上&#xff0c;每个节点运行相同的模型副本&#xff0c;但处理不同的数据子集。…

Docker Run使用方法及参数详细说明

Docker Run使用方法及参数详细说明 基本语法常用参数使用示例总结Docker Run是Docker中最基本的命令之一,用于创建并启动一个新的容器。通过Docker Run,用户可以基于指定的镜像创建一个容器实例,并且可以配置容器的各种参数,如网络设置、存储选项等。下面将详细介绍Docker …

QTDemo:串口调试工具

项目简介 本项目通过QT框架设计一款可以在Windows、Linux等平台的跨平台串口助手&#xff0c;串口功能能够满足基本的调试需求。 本项目采用的版本为&#xff1a;QT5.14 visual studio 2022 进行开发。 项目源码&#xff1a;https://github.com/say-Hai/MyCOMDemo 项目页面&am…

【K8S问题系列 | 21 】K8S中如果PV处于Bound状态,如何删除?【已解决】

在Kubernetes&#xff08;K8S&#xff09;的存储管理体系中&#xff0c;持久卷&#xff08;PersistentVolume&#xff0c;PV&#xff09;是一种重要的资源&#xff0c;它为Pod提供了持久化存储能力。当PV处于Bound状态时&#xff0c;意味着它已经与某个持久卷声明&#xff08;P…

【行业发展报告】2024大数据与智能化行业发展浅析

回首 2024&#xff0c;大数据智能化浪潮汹涌。海量数据宛如繁星&#xff0c;在智能算法的苍穹下汇聚、碰撞&#xff0c;释放出洞察市场与用户的强大能量&#xff0c;精准勾勒出商业新航线。我们精心雕琢技术架构&#xff0c;从数据存储的坚固基石到处理分析的高效引擎&#xff…

Mumu模拟器12开启ADB调试方法

在使用安卓模拟器进行开发或调试时&#xff0c;ADB&#xff08;Android Debug Bridge&#xff09;是一项不可或缺的工具。大多数模拟器默认开启了ADB调试功能&#xff0c;但在安装最新版的 Mumu模拟器12 时&#xff0c;可能会遇到 adb devices 无法识别设备的问题。 问题描述 …