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]的正则表达式怎么实现呢?浮点数的表达式怎么实现呢?这个留给读者自己实现?

原创粉丝点击