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

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

只有鼠標(biāo)移動到控件位置才行,不是想要的效果。
二、提出問題
- QLineEdit可以輸入任意字符,包括數(shù)字和文字,所以要實(shí)現(xiàn)只輸入某一范圍的數(shù)值,一開始想到用Qt內(nèi)置的QDoubleValidator來實(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("請輸入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);
}
這樣就可以通過設(shè)置一個(gè)最大最小值范圍,超過范圍清空輸入框的方式實(shí)現(xiàn)想要的效果。
- 還有一種方法是通過寫一個(gè)正則表達(dá)式來限制輸入的值的范圍,正則表達(dá)式的使用可以參考站內(nèi)文章。
//設(shè)置lineedit的提示
m_myLineEdit->setPlaceholderText("請輸入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é)束語
到此這篇關(guān)于Qt實(shí)現(xiàn)QLineEdit輸入前提示輸入范圍并用正則表達(dá)式限制輸入范圍的文章就介紹到這了,更多相關(guān)Qt QLineEdit輸入正則限制輸入范圍內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++11?condition_variable條件變量的用法說明
這篇文章主要介紹了C++11?condition_variable條件變量的用法說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
C++實(shí)踐數(shù)組作數(shù)據(jù)成員的參考
今天小編就為大家分享一篇關(guān)于C++實(shí)踐數(shù)組作數(shù)據(jù)成員的參考,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-02-02
C語言編程gcc如何生成靜態(tài)庫.a和動態(tài)庫.so示例詳解
本文主要敘述了gcc如何生成靜態(tài)庫(.a)和動態(tài)庫(.so),幫助我們更好的進(jìn)行嵌入式編程。因?yàn)橛行r(shí)候,涉及安全,所以可能會提供靜態(tài)庫或動態(tài)庫供我們使用2021-10-10

