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

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

问题

开发时,对于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

 


相关文章
无法写入用户设置。请打开用户设置并清除错误或警告,然后重试。
无法写入用户设置。请打开用户设置并清除错误或警告,然后重试。
|
前端开发 JavaScript 开发者
设置height:100%无效的原因以及两种解决方法
设置height:100%无效的原因以及两种解决方法
874 0
设置
字体分为,编辑器字体与代码的字体,这里我编辑器的字体使用的是编辑器本身的,代码的字体也是,只不过相对于代码的注释的字体和代码文件默认打开的显示大小我是有微调的,代码的注释字体为 KaiTi,代码默认打开的大小为 16,那么为啥是 16 呢而不是其它的数值呢,原因就是如果默认 16 的话,打开的代码片段刚好是在编辑器的纵坐标的分界线内,这个分界线自行去发现这里不介绍为界限是什么东西,如果有以为则在下方评论区留言即可我来解答(然后再往后的日子我发现设置 16 也不是非常的合理,自己根据自己的个人喜好来决定吧,反正我是设置的比较大字体)。
49 0
Qt-修改界面无效的可能情况
Qt修改界面无效的可能情况
462 0
|
前端开发
vcharts设置legend属性无效解决办法
内容概览 需求: 折线图上有 一个产品的目标值和实际值 ,通过点击其中一个legend,同时隐藏该产品的实际值和目标值(指折线图上的线) 当我觉得这个需求很 easy 的时候,居然发现 动态设置 legend 属性无效 …… 通过本文来记录这个解决过程,前端真是太难了 哈哈 在 v-charts 中, 折线图的写法如下: <ve-line :extend="chartExtend" :data="chartData" :events="chartEvents" height="58vh" ></ve-line>。 而 v-charts 是对 echart 的包装,很多事件都可以从 ech
1327 0
popupwindow showAsDropDown 无效解决方法
popupwindow showAsDropDown 无效解决方法
popupwindow showAsDropDown 无效解决方法
PyQt5 技术篇-设置窗口置顶不生效问题原因,setWindowFlags()设置参数后不生效解决办法
PyQt5 技术篇-设置窗口置顶不生效问题原因,setWindowFlags()设置参数后不生效解决办法
874 0
请将项目文件中的“AutoGenerateBindingRedirects”属性设置为 true 警告!!!
原文:请将项目文件中的“AutoGenerateBindingRedirects”属性设置为 true 警告!!!
2541 0