QLineEdit輸入限制
在使用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);
限制浮點數輸入范圍為[-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})?$|(^\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})?)$
1. 式子中開頭的^和結尾的$限定字符串的開始和結尾;
2. "-?" 表示一個或0個負號,這里面的問號表示其前面的字符重復0次或1次;
3. 管道符“|”表示平行分組,比如后三個,表示180或其它形式;
4. [1-9] 表示限定數字范圍為1到9,其余類似,如果是有限幾個值,還可以用枚舉的方式,比如限定-255到255時,第一個數字2的限定,應該表達為[1,2],這表示這個位置只允許是1或者2;
5. "\d"是一個轉義字符,表示匹配一位數字;
6. “\.” 表示匹配小數點;
7. "\d+",這里面的+表示其前面的\d重復一次或多次;
8. "\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)?)$
參考: