Qt中QLineEdit如何限制小数的范围(QDoubleValidator失效下解决方法)

标签: Qt QLineEdit QDoubleValidator 限制输入
920人阅读 评论(0) 收藏 举报
分类:

限制小数范围,乍看起来很简单,不是有QDoubleValidator吗?一用,没效果,我Qt版本5.6,其他版本什么情况就不知道了。。

百度,解决方法:继承QDoubleValidator,重写validate方法。

在Stackoverflow上看到的demo:

class MyDoubleValidator : public QDoubleValidator
{
public:
    MyDoubleValidator(double bottom, double top, int decimals, QObject *parent = 0)
        :QDoubleValidator( bottom, top, decimals, parent) {};
    QValidator::State validate(QString &input, int &pos) const
    {
        /*
         * Original Qt Documentation:
         * ---------
         * QDoubleValidator::validate()
         * Returns Intermediate if input contains a double that is
         * outside the range or is in the wrong format; e.g. with too many
         * digits after the decimal point or is empty.
         * ---------
         * Problem: Not what the user expects.
         * Example: Range 0.0-10.0 with 1 digit (QDoubleValidator( 0, 10, 1, parent ) ):
         * QDoubleValidator::validate() reports intermediate for "10.3".
         * However we expect invalid instead and QLineEdit to decline input.
         * Fix this by overloading the validate() operator.
         */
        const QValidator::State origState = QDoubleValidator::validate( input, pos );
        if( ( origState == QValidator::Intermediate ) && ( input.toDouble() > top() ) )
        {
            return QValidator::Invalid;
        }
        else
        {
            return origState;
        }
    }
};

https://stackoverflow.com/questions/10119310/qdoublevalidator-is-not-working

但有问题,限制不了下限。

继续找:

csdn的blog上看到的:

virtual State validate(QString &str, int &i) const
{
if (str.isEmpty())
{
return QValidator::Intermediate;
}
int a = 1;
bool cOK = false;
double val = str.toDouble(&cOK);

if (!cOK)
{
return QValidator::Invalid;
}

int dotPos = str.indexOf(".");
if (dotPos > 0)
{
if (str.right(str.length() - dotPos-1).length() > decimals())
{
return QValidator::Invalid;
}
}



if (val< top() && val > bottom())
{
return QValidator::Acceptable;
}


return QValidator::Invalid;

}


};

http://blog.csdn.net/caoqiang2006/article/details/53237188

问题又来了,小数位数限制不了了。

东拼西凑研究了一下,有个不完美的解决方案:

virtual QValidator::State validate(QString &input, int &pos) const
    {

        const QValidator::State origState = QDoubleValidator::validate( input, pos );
        if(input.isEmpty())
        {
            return QValidator::Intermediate;
        }

        if( ( origState == QValidator::Intermediate ) && (input.toDouble() > top())  )
        {
            return QValidator::Invalid;
        }
        if(( origState == QValidator::Intermediate ) && ( input.toDouble() < bottom())  )
        {
            return QValidator::Intermediate;
        }
        else
        {
            return origState   /*QValidator::Acceptable*/;
        }
    }


不完美之处:如果下限设置为0.5,输入的时候0就无法输入了,也就是说[0.51-1)之间的数字都输入不了了。

解决了:1、能处理上下限;

               2、可清空输入

由于我的需求里面小数都是0.5的整数倍,所以刚好能用,但还是有改善的空间。

尚待改善。。如果有更好的解决方法后续再更新。

Qt萌新一枚,如有不合理之处或有更好的解决方案,还望不吝教正。



查看评论

QDoubleValidator 之BUG 的修改

QDoubleValidator 用于双精度的数据的验证,但4.7.4 以下版本几乎不起作用,百度一下,也发现网友也遇到此类问题,经研究得出以下解决方案:        从QDoubleValida...
  • caoqiang2006
  • caoqiang2006
  • 2016-11-20 02:11:14
  • 1384

限制QLineEdit的数值输入范围

在使用QLineEdit输入数值时,经常遇到限制其范围的需要,比如角太阳高度角范围为[-90,90],经度值范围[-180,180],方位角范围[0,360]。Qt提供了QIntValidator和Q...
  • giselite
  • giselite
  • 2013-10-14 13:31:03
  • 24710

Qt5.9.1 QDoubleValidator 直接构建失效的解决办法

QIntValidator和QDoubleValidator都是用于限制Qt下输入组件输入的类,对于整形数一般使用QIntValidator就可以了,但是根据文档,QIntValidator的范围只能...
  • sheldon0227
  • sheldon0227
  • 2017-10-31 14:06:40
  • 71

Qt中验证器的使用

Qt提供了三个内置验证器类: QDoubleValidator,QIntValidator, QRegExpValidator。 QDoubleValidator类:提供了对浮点数的范围检查. ...
  • zb872676223
  • zb872676223
  • 2014-04-16 15:41:50
  • 2108

Qt之QLineEdit

简述QLineEdit是一个单行文本输入框。QLineEdit允许用户输入和编辑单行纯文本,提供了很多有用的编辑功能,包括:撤消和重做、剪切和粘贴、以及拖放(见setDragEnabled())。通过...
  • u011012932
  • u011012932
  • 2016-07-27 15:52:46
  • 19616

pyqt4文档阅读(10.1):QIntValidator-QDoubleValidator-QRegExpValidator

QIntValidator-QDoubleValidator-QRegExpValidator
  • ljhandlwt
  • ljhandlwt
  • 2016-10-01 18:14:01
  • 970

Qt QLineEdit 限制输入类型以及大小Int 和double

1.QLineEdit 限制整数 m_LineEditIterate = new QLineEdit(); m_LineEditIterate->setFixedWidth(100); m_Lin...
  • A_sungirl
  • A_sungirl
  • 2013-12-17 11:42:50
  • 13642

qt中的lineEdit文本输入框的输入类型限制(三种验证类)

qt的三种验证类:   1。输入int类型   QValidator *validator=new QIntValidator(100,999,this); QLineEdit *edit=...
  • senkkes
  • senkkes
  • 2015-12-19 10:35:34
  • 6573

QT 技巧

qt记录一些常用的小知识 2011-02-18 08:58 qt控制lineEdit输入限制    在qt设计中,我们有时候需要用到一个检验器来限制输入的范围,qt提供了...
  • liang890319
  • liang890319
  • 2011-11-21 18:31:28
  • 6406

QML类型说明-DoubleValidator

DoubleValidator ImportStatement:   import QtQuick 2.2 Instantiates:     QDoubleValidator   Prope...
  • Vampire_Armand
  • Vampire_Armand
  • 2014-09-04 18:32:33
  • 946
    个人资料
    等级:
    访问量: 1638
    积分: 72
    排名: 157万+