最近做了乙個小的上位機,要通過串列埠來下發幾個時間引數,為了防止誤輸入,產生不必要的麻煩,我把輸入範圍限制在0-680的浮點型資料,支援小數點後2位。學習了一下qlineedit類是如何限制輸入型別的。本來是想寫乙個函式,在下發引數時,傳qlineedit的字串引數進去,然後判斷是否合法,如果不合法,則不下發引數,請使用者修改後再確認。這麼做也實現了,但是想qt這麼強大,應該會考慮到這一點的,所以找了個更簡單,在輸入的時候就限制資料的型別,不合法的根本輸入不進去。
qlineedit是乙個單行文字輸入框,支援撤銷、重做、複製、貼上、拖放等操作,echomode模式支援,即只寫模式,可以輸入密碼等不可見的文字,官方介紹:qlineedit class
可以通過setvalidator函式來限制資料型別,
setvalidator函式的引數是qvalidator,主要有3種:
amazing!qdoublevalidator不就是我想要的嗎?但是經過實際測試發現,其中qdoublevalidator可以限制浮點型資料和輸入的小數字數,但是並不能限制輸入範圍,也就是setrange,setbottom,settop這些函式的設定並沒有生效,這難道是qt的乙個bug?我的qt版本是5.8.0,qt creator版本是4.2.1,而qregexpvalidator的使用就很強大了,需要了解正規表示式的相關知識。下面來詳細介紹一下這三種類的使用。
//限制範圍0-680,小數點2位
lineedit->setvalidator(**new** qdoublevalidator(0,680,2,**this**));
限制範圍無效,這可能是qt的乙個bug。
//設定按正規表示式限制
qregexpvalidator(const qregexp &rx, qobject *parent = q_nullptr)
//獲取設定的正規表示式
qregexp ®exp()
//設定正規表示式
void setregexp(const qregexp &rx)
//限制-180,180,並限定小數點後4位
qregexp rx("^-?(180|1?[0-7]?\\d(\\.\\d)?)$");
qregexpvalidator *preg = new qregexpvalidator(rx, this);
lineedit->setvalidator(preg);
正規表示式,又稱規則表示式。(英語:regular expression,在**中常簡寫為regex、regexp或re),電腦科學的乙個概念。正規表示式通常被用來檢索、替換那些符合某個模式(規則)的文字。許多程式語言都支援利用正規表示式進行字串操作。例如,在perl中就內建了乙個功能強大的正規表示式引擎。正規表示式這個概念最初是由unix中的工具軟體(例如sed和grep)普及開的。正規表示式通常縮寫成「regex」,單數有regexp、regex,複數有regexps、regexes、regexen。關於正規表示式的詳細介紹:正規表示式30分鐘入門教程
//正規表示式說明:
/*^(-?[0]|-?[1-9][0-9])(?:\.\d)?$|(^\t?$)
(^-?180$)|(^-?1[0-7]\d$)|(^-?[1-9]\d$)|(^-?[1-9]$)|^0$
^-?(180|1?[0-7]?\d(\.\d+)?)$
^-?(180|1?[0-7]?\d(\.\d)?)$
^-?(90|[1-8]?\d(\.\d)?)$
式子中開頭的^和結尾的$限定字串的開始和結尾;
"-?" 表示乙個或0個負號,這裡面的問號表示其前面的字元重複0次或1次;
管道符「|」表示平行分組,比如後三個,表示180或其它形式;
[1-9] 表示限定數字範圍為1到9,其餘類似,如果是有限幾個值,還可以用列舉的方式,比如限定-255到255時,第乙個數字2的限定,應該表達為[1,2],這表示這個位置只允許是1或者2;
"\d"是乙個轉義字元,表示匹配一位數字;
「\.」 表示匹配小數點;
"\d+",這裡面的+表示其前面的\d重複一次或多次;
"\d",裡面的表示重複1到4次;
*/
網上搜尋一遍,確實是qt的bug,需要重寫,下面是乙個網友實現的mydoublevalidator類。
class mydoublevalidator : public qdoublevalidator
;
#include "mydoublevalidator.h"
mydoublevalidator::mydoublevalidator(qobject *parent)
: qdoublevalidator(parent)
mydoublevalidator::~mydoublevalidator()
qvalidator:: state mydoublevalidator::validate(qstring & input, int & pos) const
bool ok = false;
double val = input.todouble(&ok);
if (!ok)
int dotpos = input.indexof(".");
if (dotpos > 0) }
if(valtop())
return qvalidator::invalid;
return qvalidator::acceptable;
}
一開始,我並不知道可以通過setvalidator函式來實現資料型別限制,我直接實現了乙個檢測輸入的qstring型別資料是否是float資料,並沒有指定小數後的位數,返回值為1表示是float型別資料,否則不是。
int dialog::floatcheck(qstring float_str)
}if(*str != '.')
str++;
}return 1;
}
/*
輸入: char *str1 = "1.2345";
char *str2 = "a.2345";
char *str3 = "0.2345";
char *str4 = "1a2345";
char *str5 = "a2345";
char *str6 = "1.2.2345";
char *str7 = "3.234.";
char *str8 = "3.234.a";
輸出:str1 : 1.2345 - 1
str2 : a.2345 - 0
str3 : 0.2345 - 1
str4 : 1a2345 - 0
str5 : a2345 - 0
str6 : 1.2.2345 - 0
str7 : 3.234. - 0
str8 : 3.234.a - 0
*/
歡迎關注我的個人部落格:www.wangchaochao.top
限制QLineEdit的數值輸入範圍
在使用qlineedit輸入數值時,經常遇到限制其範圍的需要,比如角太陽高度角範圍為 90,90 經度值範圍 180,180 方位角範圍 0,360 qt提供了qintvalidator和qdoublevalidator可以限定數值輸入範圍,如使用qintvalidator限制整數的數值範圍 例1 ...
限制QLineEdit的數值輸入範圍
1.使用正規表示式檢驗qlineedit的輸入範圍 如下 include include qlineedit lineedit new qlineedit this qregexp regexp a za z 1 9 0 9 1 9 0 9 和 1 9 d 上面的正規表示式表示只能輸入大於0的正整數...
限制QLineEdit的數值輸入範圍
在使用qlineedit輸入數值時,經常遇到限制其範圍的需要,比如角太陽高度角範圍為 90,90 經度值範圍 180,180 方位角範圍 0,360 qt提供了qintvalidator和qdoublevalidator可以限定數值輸入範圍,如使用qintvalidator限制整數的數值範圍 例1 ...