QT中要如何实现对 lineEdit 编辑框中的输入数字进行正确性检验,并在发生错误时进行提示呢?下面这段代码能帮您解决这个问题。
下面这个 CheckString 函数能检验输入的数字长度、符号和小数点符号是否正确。此函数适合放在一个公共调用的文件里,在头文件声明,在cpp文件中写实现,需要调用此函数时只需包含此头文件即可。
/*
函数功能:
检测给定的字符串是否合法。
可接受的正常字符范围:[ '0'~'9' '-' '.' ' ' ]
对应的ASIIC分别为:[ 30 39 2d 2e 20 ]
添加第三个参数,小数点后数字位数[默认是2]
输入参数:
LPCTSTR lpszString - 字符串
int iMaxLength - 最大长度[含小数点+符号]
int iDotNumber - 小数点后数字位数[默认是2]
返回参数:
0 - 正常
1 - 含有非法字符
2 - 长度超过设定值( >=iMaxLength )
3 - 格式错误(多个'.' '-' 等)
4 - 小数点长度超过指定位数[/多于2位小数]
*/
int CheckString(QString lpszString, int iMaxLength, int iDotNumber)
{
int i=0,j=0;
int iReturn = 0; // 返回数值
int iLength = 0; // 实际长度
int iPosition = 0;
int iNumOfChar = 0;
QString s=lpszString;
// 1. 检查长度是否符合要求[0 - iMaxLength]
iLength = s.length();
if( (iLength > iMaxLength)||(iLength == 0) )
iReturn = 2;
// 2. 检查格式错误
// 1) 负号 '-'
iNumOfChar = 0; iPosition = 0;
for(i=0; i<iLength; i++)
{
if( s.at(i) == '-' )
{
iNumOfChar += 1;
iPosition = i;
}
}
// 是否多于一个 或者 不在起始位置?
if( (iNumOfChar > 1)||(iPosition > 0) )
iReturn = 3;
// 2) 小数点 '.'
iNumOfChar = 0; iPosition = 0;
for(i=0; i<iLength; i++)
{
if( s.at(i) == '.' )
{
iNumOfChar += 1;
iPosition = i;
}
}
// 是否多于一个 或者 只有一个 且 在起始位置 或者 在末尾位置?
if( ( iNumOfChar>1 )||( ( iNumOfChar==1 )&&( (iPosition == 0)||( iPosition == (iLength - 1) ) ) ) )
iReturn = 3;
// 存在小数点 且 多于两位小数
if( ( iNumOfChar>0 )&&( (iLength - 1 - iPosition) > iDotNumber) )
iReturn = 4;
return iReturn;
}
在自定义UI界面的cpp文件里,在需要对 lineEdit 编辑框中的输入数字进行正确性检验的地方使用下述代码以实现功能。
//QT中text()得到的是QString类型的,将其转化为float类型
QString str1,str2;
float data1,data2;
int a = 0, b = 0;
str1=ui->lineEdit->text();
str2=ui->lineEdit_2->text();
data1 = str1.toFloat();
data2 = str2.toFloat();
float g_fEPS = 1e-6; //浮点数比较时用的小微值!
// 人工对输入的字符串进行有效性判别!
int iStatueOfStr1 = 10, iStatueOfStr2 = 10; // 非0数值表示错误, 10 = 不在错误状态[1 2 3 4]的数值!
//检验字符串(最多7字符)!
iStatueOfStr1 = CheckString(str1, 7); // 7 => 0000.00 最多位数
iStatueOfStr2 = CheckString(str2, 7);
if( (iStatueOfStr1 != 0)||(iStatueOfStr2 != 0) )// 非法数值输入弹出警告,并关闭对话框!
{
QMessageBox::critical(this,"输入数值非法!","请重新输入合法的数值");
return;
}
//校验输入数据有没超范围?
BOOL bErrOfGD = FALSE, bErrOfFX = FALSE;
//浮点数比较范围要格外小心!
//假设data1输入范围 [5000.0 - 6000.0, 0.0 - 500.0]
if( ( ((data1-6000.0)<g_fEPS)&&((data1-5000.0)>g_fEPS) )||( ((data1-500.0)<g_fEPS)&&((data1+g_fEPS)>=g_fEPS) ) )
{
bErrOfGD = FALSE;
}
else
{
bErrOfGD = TRUE;
}
//假设data2输入范围 [3000 - 4000.0, 0.0 - 1000.0]
if( ( ((data2-4000.0)<g_fEPS)&&((data2-3000.0)>g_fEPS) )||( ((data2-1000.0)<g_fEPS)&&((data2+g_fEPS)>=g_fEPS) ) )
{
bErrOfFX = FALSE;
}
else
{
bErrOfFX = TRUE;
}
if( (bErrOfGD == FALSE)&&(bErrOfFX == FALSE) )
{
//输入合法,可以对输入的数据做下一步的操作
//比如可以用信号和槽的方式,将输入的数据传给槽函数
emit sendRealData(data1,data2);
}
// 参数输入数值有错误,提示重新输入
else
{
QMessageBox::critical(this,"参数输入有错误,检查后重新输入!");
}