0
点赞
收藏
分享

微信扫一扫

关于 QLineEdit设置QDoubleValidator设置范围无效问题 的解决方法


若该文为原创文章,转载请注明原文出处

​​Qt开发专栏:各种问题解决(点击传送门)​​


问题

开发时,对于QLineEdit设置其值有限输入范围限制。

QLineEdit设置QDoubleValidator无效,设置QIntValidator有效。


无效代码与有效代码

#if 0
// 浮点数无效代码
ui->lineEdit_t->setValidator(new DoubleValidator(40, 80, 1);
#else
// 浮点数有效代码
QDoubleValidator * doubleValidator = new QDoubleValidator(40, 80, 1);
doubleValidator->setNotation(QDoubleValidator::StandardNotation);
ui->lineEdit_t->setValidator(doubleValidator);
#end
// 整数有效代码
ui->lineEdit_coverT->setValidator(new QIntValidator(0, 110));

补充(2021年05月17日)

以上方法,确实只能显示输入的位数,因为笔者是限定整数范围内的浮点数,所以忽略了,要限制浮点数带小数的,重载一下。

特别注意:比如限制1.0-10,那么QLineEdit使用之后可以输入“10.”,作为字符串转为double为10,但作为字符串存入的时候注意.的问题

#ifndef MYDOUBLEVALIDATOR_H
#define MYDOUBLEVALIDATOR_H
#include <QDoubleValidator>

class MyDoubleValidator: public QDoubleValidator
{
public:
MyDoubleValidator(double bottom, double top, int decimals, QObject * parent = 0) :
QDoubleValidator(bottom, top, decimals, parent)
{
}

QValidator::State validate(QString &s, int &i) const
{
if (s.isEmpty() || s == "-") {
return QValidator::Intermediate;
}

QChar decimalPoint = locale().decimalPoint();

if(s.indexOf(decimalPoint) != -1) {
int charsAfterPoint = s.length() - s.indexOf(decimalPoint) - 1;

if (charsAfterPoint > decimals()) {
return QValidator::Invalid;
}
}

bool ok;
double d = locale().toDouble(s, &ok);

if (ok && d >= bottom() && d <= top()) {
return QValidator::Acceptable;
} else {
return QValidator::Invalid;
}
}
};

#endif // MYDOUBLEVALIDATOR_H


若该文为原创文章,转载请注明原文出处

举报

相关推荐

0 条评论