限制QLineEdit的输入

核能气质少年 提交于 2020-03-12 05:44:41
  1. 输入型限制

ui->lineEdit->setValidator( new QIntValidator(0, 100) );

  1. 输入浮点数类型限制

ui->lineEdit->setValidator( new QDoubleValidator(-100, 100, 2) );

因为浮点数的储存方式不同所以以上代码只能实现小数位的限制,却不能限制整数位。

  1. 正则表达式限制

使用正则表达式首先需要了解一些符号的作用,比如\d用来匹配数字,下面结合一些例子说明。

例子

解释

[abc]

方括号中间是几个字母,表示a,b,c这三个单独的字符

[^abc]

除了a,b,c以外的字符

[a-z]

横杠表示范围,匹配a到z之间(包括a和z)的所有单个字符

[a-zA-Z]

a到z、A到Z的所有单个字符

^

在一行最前

$

在一行的最后

\s

匹配任意空白字符

\S

匹配任意非空白的字符

\d

任意数字

\D

任意非数字

\w

任意单字字符(字母、数字或下划线)

\W

任意非单字字符

(a|b)

a或b

a?

?代表0个或1个

a*

*代表0个或1个或多个

a+

+代表1个或多个

a{n}

n个a

a{n,}

n个或大于n个a

a{n,m}

a的个数在n和m之间(包括n和m)

 例1、输入只能从0-99999,整数

QRegExp regExp("0|[1-9]\\d{0,4}");

ui->lineEdit->setValidator( new QRegExpValidator(regExp, this) );

例2、输入-180-180的浮点型

QRegExp double_rx( "(^-?180$)|(^-?1[0-7]\\d$)|(^-?[1-9]\\d$)|(^-?[1-9]$)|^0$" );

ui->lineEdit->setValidator( new QRegExpValidator(double_rx,this) );

例3、检查输入是否符合格式

如果输入与正则表达式相匹配,则返回Acceptable;如果部分匹配,则返回Intermediate(部分匹配,意思是如果给它增加额外的字符则能够匹配正则表达式);如果不匹配则返回Invalid。

enum QValidator::State ,这个枚举类型说明了被验证的字符串是哪种类型。

QValidator::Invalid:值为0,表示字符串完全不匹配;

QValidator::Intermediate:值为1,表示部分匹配;

QValidator::Acceptable:值为2,表示完全匹配。


// integers 1 to 9999

QRegExp rx("[1-9]\\d{0,3}");

// the validator treats the regexp as "^[1-9]\\d{0,3}$"

QRegExpValidator v(rx, 0);

QString s;

int pos = 0;

 

s = "0";     v.validate(s, pos);    // returns Invalid

s = "12345"; v.validate(s, pos);    // returns Invalid

s = "1";     v.validate(s, pos);    // returns Acceptable

 

rx.setPattern("\\S+");            // one or more non-whitespace characters

v.setRegExp(rx);

s = "myfile.txt";  v.validate(s, pos); // Returns Acceptable

s = "my file.txt"; v.validate(s, pos); // Returns Invalid

 

// A, B or C followed by exactly five digits followed by W, X, Y or Z

rx.setPattern("[A-C]\\d{5}[W-Z]");

v.setRegExp(rx);

s = "a12345Z"; v.validate(s, pos);        // Returns Invalid

s = "A12345Z"; v.validate(s, pos);        // Returns Acceptable

s = "B12";     v.validate(s, pos);        // Returns Intermediate

 

// match most 'readme' files

rx.setPattern("read\\S?me(\.(txt|asc|1st))?");

rx.setCaseSensitive(false);

v.setRegExp(rx);

s = "readme";      v.validate(s, pos); // Returns Acceptable

s = "README.1ST";  v.validate(s, pos); // Returns Acceptable

s = "read me.txt"; v.validate(s, pos); // Returns Invalid

s = "readm";       v.validate(s, pos); // Returns Intermediate

 
   

 

常用的正则表达式:

非负整数:"^\d+$"

正整数:"^[0-9]*[1-9][0-9]*$"

非正整数(负整数 + 0):"^((-\d+)|(0+))$"

负整数:"^-[0-9]*[1-9][0-9]*$"

整数:"^-?\d+$"

非负浮点数(正浮点数 + 0):"^\d+(\.\d+)?$"

正浮点数:"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$"

非正浮点数(负浮点数 + 0):"^((-\d+(\.\d+)?)|(0+(\.0+)?))$"

负浮点数:"^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"

浮点数:"^(-?\d+)(\.\d+)?$"

由26个英文字母组成的字符串 "^[A-Za-z]+$"

由26个英文字母的大写组成的字符串:"^[A-Z]+$"

由26个英文字母的小写组成的字符串:"^[a-z]+$"

由数字和26个英文字母组成的字符串:"^[A-Za-z0-9]+$"

由数字、26个英文字母或者下划线组成的字符串:"^\w+$"

email地址:"^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$"

"^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$"

年-月-日:"^(\d{2}|\d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$"

月/日/年:"^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|\d{4})$" 

电话号:"(\d+-)?(\d{4}-?\d{7}|\d{3}-?\d{8}|^\d{7,8})(-\d+)?" 

IP地址:

"^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5]).(\d{1,2}|1\d\d|2[0-4]\d|25[0-5]).(\d{1,2}|1\d\d|2[0-4]d|25[0-5]).(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$"  

 

[说明]从Qt5.1开始的版本中出现类QRegularExpressionValidator用法与QRegExpValidator 类似。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!