qt中自带的DoubleValidator无法实现功能,因此需要自己实现。
继承qt自己的QDoubleValidator类,重载validate函数。
h文件:
#ifndef MYDOUBLEVALIDATOR_H
#define MYDOUBLEVALIDATOR_H
#include <QObject>
#include <QDoubleValidator>
class MyDoubleValidator : public QDoubleValidator
{
Q_OBJECT
public:
MyDoubleValidator(QObject *parent);
MyDoubleValidator(double bottom, double top, int decimals, QObject *parent=nullptr);
~MyDoubleValidator();
virtual QValidator::State validate(QString &input, int &pos) const;
};
#endif // MYDOUBLEVALIDATOR_H
validate实现时,判断是否有小数点,如果有,则判断有多少位。然后判断范围,如果不在范围里面,则把当前数乘以10继续判断,直到落在范围或超出上界,这是为了避免下界大于1时无法输入的问题。
cpp文件:
#include "mydoublevalidator.h"
MyDoubleValidator::MyDoubleValidator(QObject *parent)
: QDoubleValidator(parent)
{
}
MyDoubleValidator::MyDoubleValidator(double bottom, double top, int decimals, QObject *parent):QDoubleValidator(parent)
{
setRange(bottom,top,decimals);
}
MyDoubleValidator::~MyDoubleValidator()
{
}
QValidator:: State MyDoubleValidator::validate(QString & input, int & pos) const
{
if (input.isEmpty())
{
return QValidator::Intermediate;
}
bool OK = false;
double val = input.toDouble(&OK);
if (!OK)
{
return QValidator::Invalid;
}
int dotPos = input.indexOf(".");
if (dotPos > 0)
{
if (input.right(input.length() - dotPos - 1).length() > decimals())
{
return QValidator::Invalid;
}
}
if(val <= top() && val >= bottom())
return QValidator::Acceptable;
while(1)
{
if(val<bottom())
val = val*10;
if(val <= top() && val >= bottom())
return QValidator::Intermediate;
if(val>top())
return QValidator::Invalid;
}
}