Qt限制文本框变化输入条件的方法
来源:互联网 发布:蒙文软件下载 编辑:程序博客网 时间:2024/06/05 05:35
在《QT限制文本框输入的方法》一文中,介绍了如何通过正则表达式来限制文本框的方法,但是这种做法,是预先知道文本框的限制范围,然后再编写对应的正则表达式,然现实中往往好多应用事先并不知道文本框的输入范围,当条件改变了,文本框的相应范围也跟着改变,如果这种改变范围不多的话,通过《QT限制文本框输入的方法》中介绍的方法还可以搞定,但如果改变情况很多的话,采用上面的那种方法很显然不合适,为此,本文介绍一种根据输入范围,生成对应的正则表达式的方法。
1.用到的正则表达式知识
(1)^ 匹配字符串的开始
(2)$匹配字符串的结束
(3){n,m}重复n到m次
(4)x|y匹配x或y
(5)[0-9]匹配0到9
(6)?匹配前面的子表达式零次或一次
(7)\t匹配一个制表符(匹配退格键)
2.生成任意正整数n,范围为[1 ,n] 的正则表达式
首先看1个例子:假设n=2567,限制范围为[1,2567],其正则表达式为:
^[1-2][0-5][0-6][0-7]|[1-1][0-9]{0,3}| [1-2][0-4][0-9]{0,2}|[1-2][0-5][0-5][0-9]{0,1} |[1-9][0-9]{0-2}$
上面就是[1,2567]的正则表达式,大家有没有看出一些规律,我将上面的表达式分为3个部分,
(1)[1-2][0-5][0-6][0-7]|[1-1][0-9]{0,3}
第一部分,[]分隔号-前的数子除第一个[]为1以外,其他的都为0,分隔号后面的数字分别对应2567的十进制值;
(2) [1-2][0-4][0-9]{0,2}|[1-2][0-5][0-5][0-9]{0,1}
从次高为开始(这里也即百位),分隔号-后面的数字,比百位数字5少1,十位和个位可以是0~9的数字,也可以没有十位和个位;
接下来从十位开始,分隔号-后面的数字,比十位数字6少1,个位可以是0~9的数字,也可以没有个位。
(3)[1-9][0-9]{0-2}
第三部分,最多位数为3位,比n=2567四位少1位,所以最大输入可以是9999 < 2567
通过上面的介绍我们发现第一部,第二部分,第三部分都是有规律可循的,下面是实现方法:
QString getFormalStr(int n){ /*求十进制位,结果存放到decimalList中*/ QList <int> decimalList; while(n != 0) { decimalList.append(cycleNum % 10); n /= 10; } QString str, str1; int cnt = decimalList.count(); if (cnt > 0) { str = "^("; for (int i = cnt - 1; i >= 0; i--) { /*第一部分*/ if (i + 1 == cnt) { int decimal = decimalList.at(i); str += str1.sprintf("[1-%d]", decimal); for (int j = cnt - 2; j >= 0; j--) { str += str1.sprintf("[0-%d]", decimalList.at(j)); } if (cnt > 1 && decimal > 1) { str += "|"; str += str1.sprintf("[1-%d]", decimal - 1); str += "[0-9]"; str += str1.sprintf("{0,%d}", cnt - 1); } } /*第二部分*/ if (cnt > 2 && i + 1 != cnt) { str += "|"; for (int j = cnt - 1; j >= 0; j--) { int decimal = decimalList.at(j); if (j > i) { if (j + 1 == cnt) str += str1.sprintf("[1-%d]", decimal); else str += str1.sprintf("[0-%d]", decimal); } else if (j == i) { decimal = decimal - 1; if (decimal < 0) decimal = 0; str += str1.sprintf("[0-%d]", decimal); if (i > 0) { str += str1.sprintf("[0-9]{0,%d}", i - 1); } break; } } } } /*第三部分*/ if (cnt > 1) { str += "|[1-9]"; if (cnt > 2) str += str1.sprintf("[0-9]{0,%d}", cnt - 2); } str += ")$|(^\\t?$)"; } else { str = "(^\\t?$)"; } return str;}
应用实例:
#include <qlineedit.h>#include <QtGui/QApplication>int main(int argc, char *argv[]){ QApplication a(argc, argv); QLineEdit edit; QString str = getFormalStr(2567); QRegExp rx(str); QRegExpValidator *pReg = new QRegExpValidator(rx, &edit); edit.setValidator(pReg); edit.show(); return a.exec();}
到这里,生成[1,n]的正则表达式已经介绍完了,那么,[-n,-1]的正则表达式怎么实现呢?浮点数的表达式怎么实现呢?这个留给读者自己实现?
- Qt限制文本框变化输入条件的方法
- Qt限制文本框输入的方法
- 初学Qt:限制lineEdit文本框输入内容的方法
- 文本框textarea限制字符输入的方法
- 文本框限制只输入数字的方法
- 限制文本框的输入
- 使input文本框随输入内容变化长度的方法
- 限制文本框的输入代码
- 限制文本框的输入代码
- 限制文本框输入的问题
- 限制文本框的输入长度
- 限制文本框输入的长度
- 限制文本框的输入代码
- 对文本框的输入限制
- 限制文本框的输入长度
- 限制文本框的输入字数
- 文本框限制只能输入数字、汉子、字母的方法
- JS控制文本框textarea输入字数限制的方法
- Java并发编程之同步互斥问题
- c++11 新增内容每日学习笔记
- 关于读写锁算法的Java实现及思考
- extnet mvc direct method
- Java探索:Java内存区域
- Qt限制文本框变化输入条件的方法
- 插值排序法排序数组
- Tomcat 7.0 Manager 访问需要用户名与密码
- 重命名数据库服务器
- 第十二堂课后作业
- MySQL性能优化
- 观察者模式-----Observer-------
- poj 3342 Party at Hali-Bula(树形dp)
- lc振荡电路是如何起振的?