注意:以下均为键盘输入交互时的限制,setText无法限制。
1.只允许输入整数
ui->lineEdit->setValidator(new QIntValidator(ui->lineEdit));
2.只允许输入数字
ui->lineEdit->setValidator(new QRegExpValidator(QRegExp("[0-9]+$")));
3.只允许输入数字0-9且长度为11位
ui->lineEdit->setValidator(new QRegExpValidator(QRegExp("[0-9]{11}")));
4.只能输入字母和数字
ui->lineEdit->setValidator(new QRegExpValidator(QRegExp("[a-zA-Z0-9]+$")));
5.只能输入大写数据
ui->lineEdit->setValidator(new QRegExpValidator(QRegExp("^[A-Z]+$")));
6.只能输入小写数据
ui->lineEdit->setValidator(new QRegExpValidator(QRegExp("^[a-z]+$")));
7.只能输入字母
ui->lineEdit->setValidator(new QRegExpValidator(QRegExp("^[A-Za-z]+$")));
8.输入浮点型数据
非负浮点数(正浮点数 + 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+)?$"
9.输入-255~255的整数
ui->lineEdit->setValidator(new QRegExpValidator(QRegExp("^-?(255|[1,2]?[0-4]?\\d|[1,2]?5[0-4]?)$")));
10.限制浮点数输入范围为[-90,90]并限定为小数位后4位
ui->lineEdit->setValidator(new QRegExpValidator(QRegExp("^-?(90|[1-8]?\\d(\\.\\d{1,4})?)$")));
11.输入格式(年-月-日)
ui->lineEdit->setValidator(new QRegExpValidator(QRegExp("^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$")));
12.输入格式(月/日/年)
ui->lineEdit->setValidator(new QRegExpValidator(QRegExp("^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$")));
13.只能中文输入
ui->lineEdit->setValidator(new QRegExpValidator(QRegExp("[\u4e00-\u9fa5]+$")));
遇到的问题:想输入0-255,小数点后留两位的数字(整数与浮点数都需要)。
Qt提供了QIntValidator和QDoubleValidator可以限定数值输入范围,如使用QIntValidator限制整数的数值范围:
- 例1:
lineEdit->setValidator(new QIntValidator(0, 255, this));
- 例2:
lineEdit->setValidator(new QDoubleValidator(0,255,2,this));
对于浮点数,使用QDoubleValidator时,发现只能限制只输入小数,但是无法设定数值范围,因此有必要对这个问题做一番研究。(所以此时看似限定了0-255,实际只有保留两位小数起了作用,ԾㅂԾ,)
除了QIntValidator和QDoubleValidator,Qt提供另一种校验器是正则表达式校验器:QRegExpValidator,下面是一些常用的利用正则表达式校验器限定数值范围的用法:
限制浮点数输入范围为[-999999.9999,999999.9999]
QRegExp rx("^(-?[0]|-?[1-9][0-9]{0,5})(?:\\.\\d{1,4})?$|(^\\t?$)");
QRegExpValidator *pReg = new QRegExpValidator(rx, this);
lineEdit->setValidator(pReg);
限制浮点数输入范围为[-180,180]
QRegExp rx("(^-?180$)|(^-?1[0-7]\\d$)|(^-?[1-9]\\d$)|(^-?[1-9]$)|^0$");
QRegExpValidator *pReg = new QRegExpValidator(rx, this);
lineEdit->setValidator(pReg);
限制浮点数输入范围为[-180,180]
QRegExp rx("^-?(180|1?[0-7]?\\d(\\.\\d+)?)$");
QRegExpValidator *pReg = new QRegExpValidator(rx, this);
lineEdit->setValidator(pReg);
限制浮点数输入范围为[-180,180]并限定为小数位后4位
QRegExp rx("^-?(180|1?[0-7]?\\d(\\.\\d{1,4})?)$");
QRegExpValidator *pReg = new QRegExpValidator(rx, this);
lineEdit->setValidator(pReg);
限制浮点数输入范围为[-90,90]并限定为小数位后4位
QRegExp rx("^-?(90|[1-8]?\\d(\\.\\d{1,4})?)$");
QRegExpValidator *pReg = new QRegExpValidator(rx, this);
lineEdit->setValidator(pReg);
简单说明一下这几个正则表达式:
^(-?[0]|-?[1-9][0-9]{0,5})(?:.\d{1,4})?KaTeX parse error: Undefined control sequence: \t at position 4: |(^\̲t̲?)
(-?180$)|(^-?1[0-7]\d$)|(-?[1-9]\d ) ∣ ( − ? [ 1 − 9 ] )|(^-?[1-9] )∣(−?[1−9])|^0$
^-?(180|1?[0-7]?\d(.\d+)?)$
^-?(180|1?[0-7]?\d(.\d{1,4})?)$
^-?(90|[1-8]?\d(.\d{1,4})?)$
- 式子中开头的^和结尾的$限定字符串的开始和结尾;
- “-?” 表示一个或0个负号,这里面的问号表示其前面的字符重复0次或1次;
- 管道符“|”表示平行分组,比如后三个,表示180或其它形式;
- [1-9] 表示限定数字范围为1到9,其余类似,如果是有限几个值,还可以用枚举的方式,比如限定-255到255时,第一个数字2的限定,应该表达为[1,2],这表示这个位置只允许是1或者2;
- "\d"是一个转义字符,表示匹配一位数字;
- “.” 表示匹配小数点;
- “\d+”,这里面的+表示其前面的\d重复一次或多次;
- “\d{1,4}”,里面的{1,4}表示重复1到4次;
有了以上知识,下面我们可以很快的写出限定[-255,255]的正则表达式:
[-255,255]整数:^-?(255|[1,2]?[0-4]?\d|[1,2]?5[0-4]?)$
[-255,255]小数:^-?(255|([1,2]?[0-4]?\d|[1,2]?5[0-4]?)(.\d)?)$