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

前言

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

相关推荐
永远前进不waiting5 分钟前
C复习——1
c语言·开发语言
阿闽ooo7 分钟前
深入浅出适配器模式:从跨国插头适配看接口兼容的艺术
c++·设计模式·适配器模式
一路往蓝-Anbo17 分钟前
【第13期】中断机制详解 :从向量表到ISR
c语言·开发语言·stm32·单片机·嵌入式硬件
oioihoii2 小时前
跨越进程的对话之从管道到gRPC的通信技术演进
c++
爱装代码的小瓶子3 小时前
算法【c++】二叉树搜索树转换成排序双向链表
c++·算法·链表
阳洞洞3 小时前
cmake中如何从include_directories中移除某个特定的头文件
c++·cmake
Source.Liu3 小时前
【QOwnNotes】QOwnNotes 介绍
qt
墨雪不会编程3 小时前
C++【string篇1遍历方式】:从零开始到熟悉使用string类
java·开发语言·c++
特立独行的猫a3 小时前
QT开发鸿蒙PC应用:环境搭建及第一个HelloWorld
开发语言·qt·harmonyos·环境搭建·鸿蒙pc
JAY_LIN——83 小时前
C语言>字符 (strlen) | 字符串函数(strcpy、strcat)
c语言