QValidator的使用

inputMask就是一串由特殊字符组成的规则,通过规则给定的格式来控制文本的输入,具体的规则见下表:

特殊字符对应规则
A 必须输入的ascii字母,包括A-Z,a-z
a A一样,但是可选,也就是不输入这个字符也可以,占位符将保留
N 必须输入的ascii字母和数字,包括A-Z,a-z,0-9
n N一样,但是可选
X 必须输入的任意字符
x X一样,但是可选
9 必填的ascii的数字字符,包括0-9
0 9一样,但是可选
D 必填的数字,包括1-9
d D一样,但可选
# 可选的数字或者加减号
H 必填的16进制的数字,包括A-F, a-f, 0-9
h H一样,但可选
B 必填的二进制数字,包括0和1
b B一样,但可选
> 所有在这个特殊字符之后的字符转换为大写
< 所有在这个特殊字符之后的字符转换为小写
! 关闭前面的大小写转换
[ ] { } 保留的特殊字符
\ 将特殊字符转义为普通字符

inputMask的格式为:([特殊字符]|[普通字符])*;占位符,分号后跟的是占位符,用于填充特殊字符留下的空位,默认为空格。下面看些例子:

  1. 000,000.00;_:用于输入一个最大6位,有两位小数的值,用_填充空位,edit会显示出类似___,___.__的效果
  2. >AAAA-AAAA!-AAAA-AAAA:用于输入一个由连字符分割的字母数字组成的uuid或license key,且前八个字母会被转换为大写,在edit中显示为- - -
  3. 9999年09月09日:用于输入年月日的时间格式,可以输入2019年03月14日2019年3月14日,显示效果在引论的效果图中。
  4. 空字符串:表示没有任何输入限制

你可以通过setInputMask设置mask,或inputMask获取当前的mask。

通过上面的说明和例子你应该已经学会了inputMask的使用,现在可以看看它与validator的区别了:

  1. inputMask在用户进行输入时进行过滤,并且只存在符合规则和不符合两种状态,validator通常拥有第三种状态
  2. inputMask只能过滤较为固定的格式,并且对于输入的最大长度产生限制,validator则要灵活的多

最主要的区别是这两点。上一节提到inputMask不能替代validator,现在我们揭晓原因:inputMask只能保证输入数据的格式,但并不保证数据有意义,比如例子3中我们可以在月份上输入20,但明显日期中没有20月,而这种错误是inputMask无法处理的,这就是为什么我们说有时候一只看起来像鸭子的鸟也许和鸭子没有半点关系的原因。

因此想要获得正确的数据,我们还需要验证器来帮忙。

QValidator

QValidator应用举例:(给QLineEdit控件添加事件处理槽函数)

void MainWindow::on_lineEdit_textEdited(const QString &text)
{
    ui->lineEdit->setValidator(new QDoubleValidator(0, 3000, 2));  //设置验证器
    if(text.toDouble()<0 || text.toDouble()>3000)
    {
        QToolTip::showText(ui->lineEdit->mapToGlobal(QPoint(200, 0)), "范围应该是0-3000");
        ui->lineEdit->setStyleSheet("QLineEdit{border:1px solid red}");  //改变外观样式提示错误
    }
    else
    {
        ui->lineEdit->setStyleSheet("QLineEdit{border:1px solid gray border-radius: 1px }");
    }
}

setValidator函数的参数是QValidator,主要有3种:

  • QIntValidator //限制只能输入整数,限制范围
  • QDoubleValidator //限制只能输入浮点数,包括范围,小数点位数
  • QRegExpValidator //限制规则按指定的正则表达式

 

由于 QValidator 有一个纯虚函数 validate.所以必须要写一个 类来继承,然后实现这个纯虚函数才行。

virtual State validate(QString & input, int & pos) const = 0

这个函数返回State状态。 input是当前输入的字符串引用。pos是位置指针的引用。

在这个函数里面实现对于input的字符串的检查,然后返回对应的状态,确认是否允许输入。

返回State有三种状态:
QValidator::Invalid             明确这个输入是不允许的

QValidator::Intermediate   这个输入处在中间状态,还无法判断。需要后续。例如输入ip地址000.000.000.000这样可以返回intermediate。然后在fixup里面修复成0.0.0.0 (其实还是没太理解这里怎么用)。

 QValidator::Acceptable    这个输入是允许的

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<bottom()|| val>top())
        return QValidator::Invalid;
    return QValidator::Acceptable;
}

 

posted @ 2022-04-10 11:35  云山漫卷  阅读(1956)  评论(0编辑  收藏  举报