Qt實(shí)現(xiàn)QLineEdit輸入前提示輸入范圍并用正則表達(dá)式限制輸入范圍
簡(jiǎn)介
總結(jié)項(xiàng)目中遇到的一些問(wèn)題,重寫QLineEdit 實(shí)現(xiàn)這一功能。
1. 想在QSpinBox中設(shè)置一個(gè)輸入前的提示框,但是其沒(méi)有setPlaceHolderText方法,用setToolTip設(shè)置懸浮提示框只能放在控件上才能顯示。
2. 用QLineEdit可以用setPlaceHolderText來(lái)設(shè)置輸入前的提示框,又沒(méi)有可以設(shè)置大小范圍的方法。于是想到可以利用正則表達(dá)式來(lái)實(shí)現(xiàn)。
一、運(yùn)行效果

如果是使用QDoubleSpinBox只能有的效果圖:

只有鼠標(biāo)移動(dòng)到控件位置才行,不是想要的效果。
二、提出問(wèn)題
- QLineEdit可以輸入任意字符,包括數(shù)字和文字,所以要實(shí)現(xiàn)只輸入某一范圍的數(shù)值,一開始想到用Qt內(nèi)置的QDoubleValidator來(lái)實(shí)現(xiàn)輸入0.0-100.0的浮點(diǎn)型數(shù)值,不知道是不是Qt的Bug,這個(gè)設(shè)置實(shí)現(xiàn)不了輸入的限制。
//設(shè)置輸入范圍,實(shí)現(xiàn)輸入框只能輸入0.0-100.0且小數(shù)點(diǎn)后兩位
QDoubleValidator *validator = new QDoubleValidator(0.0, 100.0, 2);
m_myLineEdit->setValidator(validator);

效果圖可知輸入100之后再輸入也是可以的,可自行嘗試。
QIntValidator *validator = new QIntValidator(0, 100);
m_myLineEdit->setValidator(validator);

QIntValidator設(shè)置成0-100,在輸入小于100的數(shù)值后,再輸入還是可以輸入。
解決方法
- 既然輸入的值可以顯示超出設(shè)置的范圍,想到可以重寫一個(gè)QLineEdit,設(shè)置一個(gè)最大最小值,然后每次輸入判斷輸入的值是否在這個(gè)范圍內(nèi),不在則清空輸入框。
MyLineEdit.h
#include <QWidget>
#include <QLineEdit>
class MyLineEdit : public QLineEdit
{
Q_OBJECT
public:
explicit MyLineEdit(QWidget *parent = nullptr);
public:
//設(shè)置最大最小輸入范圍
void setMaxValue(double max);
void setMinValue(double min);
signals:
public slots:
//當(dāng)輸入的值不在范圍內(nèi),光標(biāo)離開編輯框時(shí)清空
void slotClearEdit(QString text);
private:
double m_max;
double m_min;
};
MyLineEdit.cpp
#include "MyLineEdit.h"
MyLineEdit::MyLineEdit(QWidget *parent) : QLineEdit(parent)
{
connect(this, SIGNAL(textChanged(QString)), this, SLOT(slotClearEdit(QString)));
}
void MyLineEdit::setMaxValue(double max)
{
m_max = max;
}
void MyLineEdit::setMinValue(double min)
{
m_min = min;
}
void MyLineEdit::slotClearEdit(QString text)
{
if(text.toDouble() < m_min || text.toDouble() > m_max)
{
this->clear();
}
}
MainWindow.cpp
#include "MainWindow.h"
#include "ui_MainWindow.h"
#include "MyLineEdit.h"
#include <QGridLayout>
#include <QDoubleSpinBox>
#include <QIntValidator>
#include <QDoubleValidator>
#include <QRegExpValidator>
MainWindow::MainWindow(QWidget *parent) :
QWidget(parent),
ui(new Ui::MainWindow),
m_myLineEdit(nullptr),
m_lab(nullptr)
{
ui->setupUi(this);
initUI();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::initUI()
{
QGridLayout* layout = new QGridLayout(this);
m_myLineEdit = new MyLineEdit();
m_lab = new QLabel("輸入:");
layout->addWidget(m_lab, 0, 0);
layout->setColumnStretch(0,1);
layout->addWidget(m_myLineEdit, 0, 1);
layout->setColumnStretch(1,4);
//設(shè)置lineedit的提示
m_myLineEdit->setPlaceholderText("請(qǐng)輸入0.0-100.0的數(shù)");
//設(shè)置最大最小值
m_myLineEdit->setMaxValue(100.0);
m_myLineEdit->setMinValue(0.0);
//設(shè)置輸入范圍
QDoubleValidator *validator = new QDoubleValidator(0.0, 100.0, 2);
m_myLineEdit->setValidator(validator);
}
這樣就可以通過(guò)設(shè)置一個(gè)最大最小值范圍,超過(guò)范圍清空輸入框的方式實(shí)現(xiàn)想要的效果。
- 還有一種方法是通過(guò)寫一個(gè)正則表達(dá)式來(lái)限制輸入的值的范圍,正則表達(dá)式的使用可以參考站內(nèi)文章。
//設(shè)置lineedit的提示
m_myLineEdit->setPlaceholderText("請(qǐng)輸入0-100的數(shù)");
//設(shè)置最大最小值
//m_myLineEdit->setMaxValue(100);
//m_myLineEdit->setMinValue(0);
//設(shè)置輸入范圍
QRegExpValidator *validator = new QRegExpValidator(QRegExp("\\d{2}|100"), this);
m_myLineEdit->setValidator(validator);
一個(gè)完整的正則表達(dá)式是可以實(shí)現(xiàn)想要的效果的。
結(jié)束語(yǔ)
到此這篇關(guān)于Qt實(shí)現(xiàn)QLineEdit輸入前提示輸入范圍并用正則表達(dá)式限制輸入范圍的文章就介紹到這了,更多相關(guān)Qt QLineEdit輸入正則限制輸入范圍內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于c++11與c風(fēng)格路徑拼接的速度對(duì)比
這篇文章主要介紹了關(guān)于c++11與c風(fēng)格路徑拼接的速度對(duì)比分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
C語(yǔ)言使用strcmp()函數(shù)比較兩個(gè)字符串的實(shí)現(xiàn)
這篇文章主要介紹了C語(yǔ)言使用strcmp()函數(shù)比較兩個(gè)字符串的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
Matlab利用遺傳算法GA求解非連續(xù)函數(shù)問(wèn)題詳解
遺傳算法起源于對(duì)生物系統(tǒng)所進(jìn)行的計(jì)算機(jī)模擬研究。其本質(zhì)是一種高效、并行、全局搜索的方法,能在搜索過(guò)程中自動(dòng)獲取和積累有關(guān)搜索空間的知識(shí),并自適應(yīng)地控制搜索過(guò)程以求得最佳解。本文將利用其求解非連續(xù)函數(shù)問(wèn)題,需要的可以參考一下2022-09-09
C++?電話號(hào)碼的字母組合功能實(shí)現(xiàn)
這篇文章主要介紹了C++?電話號(hào)碼的字母組合,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08
在Qt中使用QtWebApp搭建HTTP服務(wù)器的詳細(xì)步驟
QtWebApp是一個(gè)開源項(xiàng)目,它基于著名的Qt?Framework開發(fā),提供了一種在C++環(huán)境中構(gòu)建HTTP服務(wù)器的解決方案,這篇文章主要給大家介紹了關(guān)于在Qt中使用QtWebApp搭建HTTP服務(wù)器的詳細(xì)步驟,需要的朋友可以參考下2024-07-07
C語(yǔ)言有符號(hào)和無(wú)符號(hào)在內(nèi)存中的存儲(chǔ)方式區(qū)別小結(jié)
有符號(hào)和無(wú)符號(hào)類型在內(nèi)存中的二進(jìn)制存儲(chǔ)內(nèi)容完全相同,區(qū)別僅在于編譯器對(duì)二進(jìn)制位的解釋規(guī)則?,下面就來(lái)詳細(xì)的介紹一下,感興趣的可以了解一下2025-12-12
c++如何控制輸出浮點(diǎn)數(shù)小數(shù)點(diǎn)后若干位
這篇文章主要介紹了c++如何控制輸出浮點(diǎn)數(shù)小數(shù)點(diǎn)后若干位問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09

