網站首頁 編程語言 正文
前言
本文實現了自定義的驗證碼輸入框控件??丶▓D標、輸入框、獲取驗證碼按鈕、驗證碼獲取倒計時標簽。支持鼠標點擊獲取驗證碼按鈕后開始顯示倒計時功能,倒計時為0時,才可以在此點擊獲取驗證碼按鈕。效果如圖:
主要的編程思想還是實現自定義控件的封裝性和共用性。
UI布局:
- 控件1:QWidget,實現整個控件的封裝,這個控件使用水平布局,實現控件的水平擺放,同時,當其中一個控件隱藏時,位置會重新更新,實現在控件的后面只顯示獲取驗證碼和倒計時兩個控件中的一個。
- 控件2:QLabel,實現展示盾牌圖標。
- 控件3:QLineEdit,實現驗證碼輸入功能。
- 控件4:QPushButton,實現獲取驗證碼功能。
- 控件5:QLabel,實現倒計時顯示。
頁面樣式初始化:
控件1:實現外邊框和背景: 邊框寬1像素,顏色#DBDBDB,背景顏色#FFFFFF。
setStyleSheet("QWidget#widget{border:1px solid #DBDBDB;background-color:#FFFFFF;}");
控件2:實現盾牌圖標的展示: 圖片資源:image/vCode.png。
ui.lablevCode->setStyleSheet("border-image:url(image/vCode.png);");
控件3:實現驗證碼輸入功能: 無邊框,背景顏色#FFFFFF,字體顏色#333333。
ui.lineEdit->setStyleSheet("QLineEdit{border:0px;color:#333333;background:#FFFFFF;}");
控件4:實現獲取驗證碼按鈕: 無邊框,字體顏色#999999,鼠標懸浮時字體顏色#3B85FF。
ui->pushButton->setStyleSheet("QPushButton{border:none;color:#999999;}" "QPushButton:hover{border:none;color:#3B85FF;}");
控件5:初始化隱藏(在沒有點擊獲取驗證碼按鈕時為隱藏狀態,點擊獲取驗證碼按鈕后,顯示倒計時,隱藏獲取驗證碼按鈕)。字體顏色#b7b7b7。
ui->label_time->setStyleSheet("QLabel{color:#b7b7b7;}"); ui->label_time->hide();
除了這些控件外,我們還需要創建一個定時器,用來實現倒計時的功能,定時器的溢出時間為1s,定時器的槽函數為slotVCodeTimeout()。
//創建成員變量 QTimer *m_timer; //動態創建定時器,并指定定時器的溢出事件和槽函數 m_vCodeTimer = new QTimer(this); connect(m_vCodeTimer, SIGNAL(timeout()), this, SLOT(slotVCodeTimeout())); m_vCodeTimer->setInterval(1000); // 1s
功能實現:
1. 輸入限制:
不顯示上下文菜單,禁止輸入中文,默認顯示“請輸入驗證碼”,手機號只能是11位0~9的數字。
ui.lineEdit->setContextMenuPolicy (Qt::NoContextMenu); // 不顯示上下文菜單 ui.lineEdit->setAttribute(Qt::WA_InputMethodEnabled, false); // 設置禁止中文輸入 ui.lineEdit->setPlaceholderText(QString::fromLocal8Bit("請輸入驗證碼")); // 設置默認顯示內容 QRegExp rx("[0-9]{1,8}"); // 正則表達式:數字, 8位 QRegExpValidator *validator = new QRegExpValidator(rx, this); ui.lineEdit->setValidator(validator);// 設置正則表達式
2.點擊獲取驗證碼按鈕,執行獲取驗證碼操作:
在按鈕的點擊響應函數中,調用獲取驗證碼的方法,通常是調用后臺接口,實現給指定手機號發送驗證碼的功能。這里可以發射一個信號,由控件外部響應這個信號,再做相應的操作,如判斷是否輸入手機號、手機號是否正確、調用后臺接口、判斷是否成功發送驗證碼等。
void VCodeLineEdit::on_pushButton_clicked() { //調用獲取驗證碼方法 }
3.隱藏獲取驗證碼按鈕,顯示倒計時:
ui->pushButton->hide();//隱藏獲取驗證碼按鈕 ui->label_time->show();//顯示倒計時標簽 if (m_vCodeTimer->isActive())如果定時器已經啟動,先停止定時器,再重新打開定時器 { m_vCodeTimer->stop(); } m_vCodeTimer->start(); //設置倒計時顯示的文本 ui->label_time->setText(QString::number(m_time) +QStringLiteral("s后重新發送"));
4.定時器響應函數:
這里定義了一個成員變量m_time,m_time的初始值設置為60(倒計時事件為60s)。每次定時器溢出,m_time的值減1,先判斷m_time是否已經小于等于0。如果是,則表示倒計時結束,隱藏倒計時標簽,重新顯示獲取驗證碼按鈕,并關閉定時器,重置m_time。如果沒有小于等于0,表示倒計時沒有結束,則更新倒計時顯示標簽內容。
m_time -= 1; if(m_time <= 0) { ui->label_time->hide(); ui->pushButton->show(); if (m_vCodeTimer->isActive()) { m_vCodeTimer->stop(); } m_time = 60; } else{ ui->label_time->setText(QString::number(m_time) +QStringLiteral("s后重新發送")); }
原文鏈接:https://juejin.cn/post/7080814380538920997
相關推薦
- 2022-10-14 基于docker容器的gitlab遷移與數據恢復
- 2022-10-16 Ant?Design?組件庫按鈕實現示例詳解_React
- 2023-02-26 詳解Golang時間處理的踩坑及解決_Golang
- 2022-12-11 Rust中Cargo的使用詳解_Rust語言
- 2022-04-30 C#繪制實時曲線圖的方法詳解_C#教程
- 2022-10-05 linux查看服務器開放的端口和啟用的端口多種方式_Linux
- 2022-03-27 基于rsync寫腳本實現多節點多服務器文件一鍵同步的方法_相關技巧
- 2022-08-19 WPF在VisualTree上增加Visual_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支