简介
总结项目中遇到的一些问题,重写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);
一个完整的正则表达式是可以实现想要的效果的。
结束语
开发过程中遇到的小问题,总结记录,希望可以对大家有帮助,互相学习,多多指教!