Qt之校验器
1.QValidator类
QValidator类用于对用户输入文本进行校验。
QValidator类是虚类,它有四个子类,分别是:QIntValidator,QDoubleValidator,QRegExpValidator,QRegularExpressionValidator。
QIntValidator类:对用户输入的整数文本进行校验
QDoubleValidator类:对用户输入的浮点数文本进行校验
QRegExpValidator类:使用自定义的正则表达式对输入的文本进行校验
QRegularExpressionValidator:和QRegExpValidator类一样也是通过正则表达式对输入的文本进行校验。
通过继承QValidator实现自己的子类,在自定义的子类中,需要通过实现虚函数validate()和fixup()来实现自定义的校验器功能。上面列出的四种校验器就是QValidator的子类。
QValidator有三种状态,如下表所示:
常量 | 值 | 描述 |
QValidator:InValid | 0 | 输入文本无效 |
QValidator:Intermediate | 1 | 输入文本处于还未确定状态 |
QValidator:Acceptable | 2 | 输入文本有效 |
其中的InValid和Acceptable都很容易理解,要么无效,要么有效,唯独Intermediate状态,就是有点模糊了。
用例子来说明Intermediate状态吧
假设我们对一个lineEdit的输入文本设置了100~200的整数范围限制:
我们来看几种情况
a)输入的文本是”abcd”肯定是无效的,因为都不是数字;
b)输入的文本是“1314”肯定也是无效的,因为超范围了
c)输入“128”肯定是有效的,因为再范围内
d)输入“11”则是Intermediate状态,为什么呢?因为此时有可能是用户未输入完,还在编辑状态,但它又并不是有效状态,所以会被认定为Intermediate状态.
以QIntValidator为例,来讲述这三种状态:
QIntValidator* validator = new QIntValidator(100,200,this);
QString str;
int pos = 0;
str = "101";
qDebug()<<validator->validate(str,pos); //return valid
str = "10";
qDebug()<<validator->validate(str,pos); //return intermediate
str = "300";
qDebug()<<validator->validate(str,pos); //return invalid
对应的输出结果如下:
2
1
0
对应的输出结果和表格对应来看,就很容易理解了。
校验器QValidator主要用于QLineEdit,QSpinBox和QComboBox.
2.QIntValidator类
此校验器用于确保用户输入文本(整数字符串)要在指定范围内。
//构造QIntValidator类
QIntValidator* intValidator = new QIntValidator(100,200,this);
//给lineEdit设置校验器
ui->intValidatorLineEdit->setValidator(intValidator);
我们除了在构造函数时指定validator范围外,还可以通过其内部函数来更改其范围,QIntValidator类为我们提供了setRange(int bottom,int top)函数,或者通过setBottom(int)和setTop(int)来实现,例如:
//方法一
QIntValidator* intValidator = new QIntValidator(100,200,this);
//QIntValidator* intValidator = new QIntValidator(this);
//方法二
intValidator->setRange(300,500);
//方法三
intValidator->setBottom(1000);
intValidator->setTop(1200);
ui->intValidatorLineEdit->setValidator(intValidator);
采用方法2,3的时候我们可以直接构造一个不指定范围的构造函数。
3.QDoubleValidator类
QDoubleValidator类的用法和QIntValidator类似,不过它比QIntValidator多了一个参数,用于指定小数点后多少位。我们可以先来看看它的构造函数:
QDoubleValidator(QObject *parent = Q_NULLPTR)
QDoubleValidator(double bottom, double top, int decimals, QObject *parent = Q_NULLPTR)
其中的第二个构造函数,bottom为下限,top为上限,decimals为小数点后位数
例如:
QDoubleValidator* dValidator = new QDoubleValidator(1.0,100.0,3,this);
dValidator指定了范围为1.0~100.0,其中允许输入的浮点数小数点后最多3位。
同样的我们也可以通过调用setRange(double min,double max,int decimals)或者setBottom(double),setTop(double),setDecimals(int)来设置下限,上限,小数点后精度。
4.QRegExpValidator类
QRegExpValidator类的校验方式就比QIntValidator和QDoubleValidator要复杂多了,也比它们的功能更丰富。
根据名字就能明白,此类是通过正则表达式的方式来检验输入的字符串。
先来简单了解一下正则表达式:
‘^’表示字符串的开始,例如:“^ab”表示以”ab”开始的字符串
‘
′表示字符串的结束,例如:"cd
”表示以”cd”结尾的字符串
‘?’表示至多一个,也就是零个或一个,例如“ab?”表示”a”后可以跟b也可以不跟b,也就是”a”或”ab”
‘+’表示至少一个,也就是1个或更多个,例如”ab+”表示“a”后跟b或者更多个b,也就是“ab”,”abb”…..
‘*’表示0个或更多个
‘.’表示匹配任意字符
‘-’表示范围连接符,例如[0-9]表示0~9的任意一个数字
E{n}表示字符串E出现n次,比如x{5}表示字符串”xxxxx”
E{n,}表示字符串E至少出现n次,比如x{3},表示字符串”xxx”,”xxxx”……
E{,m}表示字符串E最多出现m次,比如x{,3},表示这些字符串”“,x”,”xx”,”xxx”
E{n,m}表示字符串E最少出现n次,最多出现m次
‘\d’表示匹配数字
‘\D’表示匹配非数字的任意字符
‘\s’表示匹配空格符
‘\S’表示匹配非空字符
‘\w’表示匹配单词
然后再来看看QRegExpValidator类的构造函数
QRegExpValidator(QObject *parent = Q_NULLPTR)
QRegExpValidator(const QRegExp &rx, QObject *parent = Q_NULLPTR)
//定义正则表达式
//此表达式1~3位整数,包含正负数
//-?表示没有或者有一个负号
//\\d第一个\表示转义字符,因为‘\d’表示匹配数字
//\\d{1,3}表示数字最少一个,最多三个
QRegExp rx("-?\\d{1,3}");
//传入rx生成QRegExpValidator对象
QRegExpValidator* v = new QRegExpValidator(rx,this);
QLineEdit*edit = new QLineEdit(this);
//给QLineEdit设置校验器
eidt->setValidator(v);
5.QRegularExpressionValidator类和QRegularExpression
QRegularExpression类可以代替QRegExp,同样的QRegularExpressionValidator代替QRegExpValidator。
用法上类似,不过此种用法兼容Perl语言的正则表达式。