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-07C++實(shí)踐數(shù)組作數(shù)據(jù)成員的參考
今天小編就為大家分享一篇關(guān)于C++實(shí)踐數(shù)組作數(shù)據(jù)成員的參考,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-02-02C語言編程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