日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Qt實現自定義驗證碼輸入框控件的方法_C 語言

作者:黑兔子 ? 更新時間: 2022-06-04 編程語言

前言

本文實現了自定義的驗證碼輸入框控件??丶▓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

欄目分類
最近更新