Qt实现QLineEdit输入前提示输入范围并用正则表达式限制输入范围
作者:眸中yue
在日常开发过程中QLineEdit作为输入框,有时要限制输入的内容,这篇文章主要给大家介绍了关于Qt实现QLineEdit输入前提示输入范围并用正则表达式限制输入范围的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
简介
总结项目中遇到的一些问题,重写QLineEdit 实现这一功能。
1. 想在QSpinBox中设置一个输入前的提示框,但是其没有setPlaceHolderText方法,用setToolTip设置悬浮提示框只能放在控件上才能显示。
2. 用QLineEdit可以用setPlaceHolderText来设置输入前的提示框,又没有可以设置大小范围的方法。于是想到可以利用正则表达式来实现。
一、运行效果
如果是使用QDoubleSpinBox只能有的效果图:
只有鼠标移动到控件位置才行,不是想要的效果。
二、提出问题
- QLineEdit可以输入任意字符,包括数字和文字,所以要实现只输入某一范围的数值,一开始想到用Qt内置的QDoubleValidator来实现输入0.0-100.0的浮点型数值,不知道是不是Qt的Bug,这个设置实现不了输入的限制。
//设置输入范围,实现输入框只能输入0.0-100.0且小数点后两位 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设置成0-100,在输入小于100的数值后,再输入还是可以输入。
解决方法
- 既然输入的值可以显示超出设置的范围,想到可以重写一个QLineEdit,设置一个最大最小值,然后每次输入判断输入的值是否在这个范围内,不在则清空输入框。
MyLineEdit.h
#include <QWidget> #include <QLineEdit> class MyLineEdit : public QLineEdit { Q_OBJECT public: explicit MyLineEdit(QWidget *parent = nullptr); public: //设置最大最小输入范围 void setMaxValue(double max); void setMinValue(double min); signals: public slots: //当输入的值不在范围内,光标离开编辑框时清空 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); //设置lineedit的提示 m_myLineEdit->setPlaceholderText("请输入0.0-100.0的数"); //设置最大最小值 m_myLineEdit->setMaxValue(100.0); m_myLineEdit->setMinValue(0.0); //设置输入范围 QDoubleValidator *validator = new QDoubleValidator(0.0, 100.0, 2); m_myLineEdit->setValidator(validator); }
这样就可以通过设置一个最大最小值范围,超过范围清空输入框的方式实现想要的效果。
- 还有一种方法是通过写一个正则表达式来限制输入的值的范围,正则表达式的使用可以参考站内文章。
//设置lineedit的提示 m_myLineEdit->setPlaceholderText("请输入0-100的数"); //设置最大最小值 //m_myLineEdit->setMaxValue(100); //m_myLineEdit->setMinValue(0); //设置输入范围 QRegExpValidator *validator = new QRegExpValidator(QRegExp("\\d{2}|100"), this); m_myLineEdit->setValidator(validator);
一个完整的正则表达式是可以实现想要的效果的。
结束语
到此这篇关于Qt实现QLineEdit输入前提示输入范围并用正则表达式限制输入范围的文章就介绍到这了,更多相关Qt QLineEdit输入正则限制输入范围内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!