本文目的,实现QLineEdit输入文本的限制,例如输入限制为:10.0000~89.9975,步进为0.0025;
知识点,网上有通过setValidator正则式和子网掩码setInputMask方式来实现小数输入范围:
void MainWindow::initLineEdit()
{
QRegExp regExp("(([1-8]\\d))\\.\\d{2}[0,2,5,7][0,5]");
QRegExpValidator *pReg = new QRegExpValidator(regExp, this);
ui->lineEdit->setValidator(pReg);
ui->lineEdit->setInputMask("00.0000;0");
}
void MainWindow::on_lineEdit_textChanged(const QString &arg1)
{
qDebug() << "arg1:" << arg1;
}
通过绑定的信号槽发现,当输入为10.5000时,对应的arg1的值1.5。----------巨坑,可能是我对setInputMask研究不够吧,但是这个数据坑死我了,所以这种方法对于我来说不可行;
- 无法实现数据的正确保存;
- 无法自动补全步进;
实现方法如下,自动补齐小数点和补全步进:
void MainWindow::initLineEdit()
{
QRegExp regExp("(([1-8]\\d))\\.\\d{2}[0,2,5,7][0,5]");
QRegExpValidator *pReg = new QRegExpValidator(regExp, this);
ui->lineEdit->setValidator(pReg);
// ui->lineEdit->setInputMask("00.0000;0");
ui->lineEdit->setText("10.0000");
}
void MainWindow::on_lineEdit_textChanged(const QString &arg1)
{
static QString temp; //创建静态局部变量,保存上次文本内容
qDebug() <<"arg1:" << arg1;
qDebug() <<"temp:" << temp;
if(arg1.length() == 2 &&
temp.length() == 1 &&
(!arg1.contains(".")))
{
//case 1,当前输入两位数,且上次为一位数,说明此时正在输入,自动添加小数点
temp = arg1+".";
}
else if(arg1.length() == 6 &&
temp.length() == 5)
{
//case 2,当前输入为千分位,即小数点后第三位,自动进行0或5的补全
switch (arg1.at(5).digitValue()) {
case 2:
case 7:
temp = arg1+QString::number(5);
break;
case 0:
case 5:
temp = arg1+QString::number(0);
break;
default:
break;
}
}
else
{
temp = arg1;
}
ui->lineEdit->setText(temp);
}
要点1:通过静态局部变量来存储上次(QlineEdit输入)输入内容,在QLineEdit输入12575时,控制台打印输出如下,temp静态变量会存储文本更改之前的内容,从而实现文本的自动补全和删除;
要点2:有些arm上不支持[.]按键,我们可以通过这种方法来实现小数点的自动添加,提高用户体验;