在使用QLineEdit輸入數值時,經常遇到限制其范圍的需要,比如角太陽高度角范圍為[-90,90],經度值范圍[-180,180],方位角范圍[0,360]。Qt提供了QIntValidator和QDoubleValidator可以限定數值輸入范圍,如使用QIntValidator限制整數的數值范圍:
例1:
- lineEdit->setValidator(new QIntValidator(0, 1000, this));
例2:
- lineEdit->setValidator(new QDoubleValidator(-180.0,180.0,6,this));
對於浮點數,使用QDoubleValidator時,發現只能限制只輸入小數,但是無法設定數值范圍,因此有必要對這個問題做一番研究。
除了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);
- QRegExp rx("(^-?180$)|(^-?1[0-7]\\d$)|(^-?[1-9]\\d$)|(^-?[1-9]$)|^0$");
- QRegExpValidator *pReg = new QRegExpValidator(rx, this);
- lineEdit->setValidator(pReg);
- 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})?$|(^\t?$)
(^-?180$)|(^-?1[0-7]\d$)|(^-?[1-9]\d$)|(^-?[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)?)$
參考:
[1]Qt限制文本框輸入的方法
[4]求正則表達式,在-180到180之間的數字,包括浮點數
http://blog.csdn.net/giselite/article/details/12708031