QLineEdit限制資料型別 只能輸入浮點型數

2022-07-07 21:00:17 字數 3710 閱讀 6572

最近做了乙個小的上位機,要通過串列埠來下發幾個時間引數,為了防止誤輸入,產生不必要的麻煩,我把輸入範圍限制在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 ...