增加定时按钮
点击获取验证码后需要让按钮显示倒计时,然后倒计时结束后再次可点击。
添加TimberBtn类
1  | 
  | 
添加实现
1  | 
  | 
然后将注册界面获取按钮升级为TimerBtn
调整输入框错误提示
在RegisterDialog构造函数中删除原来的输入框editing信号和逻辑,添加editingFinished信号和处理逻辑。
1  | //day11 设定输入框输入后清空字符串  | 
global.h中添加TipErr定义
1  | enum TipErr{  | 
RegisterDialog声明中添加
1  | QMap<TipErr, QString> _tip_errs;  | 
_tip_errs用来缓存各个输入框输入完成后提示的错误,如果该输入框错误清除后就显示剩余的错误,每次只显示一条
实现添加错误和删除错误
1  | void ResetDialog::AddTipErr(TipErr te, QString tips)  | 
实现错误检测
1  | bool ResetDialog::checkUserValid()  | 
除此之外修改之前点击确认按钮的逻辑,改为检测所有条件成立后再发送请求
1  | void ResetDialog::on_sure_btn_clicked()  | 
隐藏和显示密码
我们在输入密码时希望能通过点击可见还是不可见,显示密码和隐藏密码,这里先添加图片放入资源中,然后在Register.ui中添加两个label,分别命名为pass_visible和confirm_visible, 用来占据位置。
因为我们要做的点击后图片要有状态切换,以及浮动显示不一样的效果等,所以我们重写ClickedLabel,继承自QLabel.
1  | 
  | 
一个Label有六种状态,普通状态,普通的悬浮状态,普通的点击状态,选中状态,选中的悬浮状态,选中的点击状态。
当Label处于普通状态,被点击后,切换为选中状态,再次点击又切换为普通状态。
ClickLbState定义在global.h中,包含两种状态一个是普通状态,一个是选中状态。而Label中的六种状态就是基于这两种状态嵌套实现的。
1  | enum ClickLbState{  | 
六种状态用qss写好,这样我们只需要根据鼠标事件切换不同的qss就可以实现样式变换。
1  | #pass_visible[state='unvisible']{  | 
我们实现ClickedLabel功能
1  | 
  | 
将label升级为ClickedLabel,然后在RegisterDialog的构造函数中添加label点击的响应函数
1  | 
  | 
这样就实现了通过点击切换密码的显示和隐藏。
注册成功提示页面
注册成功后要切换到提示页面,所以在initHandlers函数内实现收到服务器注册回复的请求
1  | //注册注册用户回包逻辑  | 
页面切换逻辑
1  | void RegisterDialog::ChangeTipPage()  | 
在RegisterDialog.ui中stackwidget的page2添加标签和返回按钮

在RegisterDialog构造函数中添加定时器回调
1  | // 创建定时器  | 
除此之外在返回按钮的槽函数中停止定时器并发送切换登录的信号
1  | void RegisterDialog::on_return_btn_clicked()  | 
取消注册也发送切换登录信号
1  | void RegisterDialog::on_cancel_btn_clicked()  | 
界面跳转
回到mainwindow,构造函数简化,只做登录界面初始化
1  | MainWindow::MainWindow(QWidget *parent) :  | 
在点击注册按钮的槽函数中
1  | void MainWindow::SlotSwitchReg()  | 
切换登录界面
1  | //从注册界面返回登录界面  | 
这样登录界面和注册界面的切换逻辑就写完了。