一般Qt里使用正则表达式,我们一般这样使用
//限制输入0.00-9999.99
QRegExp regx("^\\d{1,4}(\\.\\d{1,2})?$");
QValidator* validator = new QRegExpValidator(regx, ui.lineEdit);
//编辑框设置
ui.lineEdit->SetValidator(validator);
然后编辑框就会生效,很多人使用到了EditFinished信号去做一些结尾处理,比如我这边的组件用于自动去除前后空格
connect(this, &QLineEdit::editingFinished, this, &CustomLineEdit::slotEditFinished);
void CustomLineEdit::slotEditFinished()
{
//先执行该处,再执行外部,所以不会出问题
if(atuoRemoveSpace)
{
//输入完成,去除输入的字符串前后空格
QString tmpText = this->text().trimmed();
this->setText(tmpText);
}
}
原因是EditFinished信号发出,是在编辑框满足了正则表达式后才会发出的。
仔细看上面这个正则
^\\d{1,4}(\\.\\d{1,2})?$
我们输入9999.99 12.2等都是正常。如果我们 一旦输入99. 最后一位是小数点。那么我们可以输入。但是正则的校验却不会通过,这个时候EditFinished信号就发不出来
这个时候就可以考虑正则表达式的问题了。如果用FocusoutEvent,不会有这种问题,但正则也不好发现有问题,万一有一天其他人用这个组件去接了EditFinished,发现出不来,就会引起问题
于是我们把正则做一些修改
^\\d{1,4}((\\.)(\\d{1,2})?)?$
用括号把 小数点 和数字都括在一起,加问号,表示这个出现一次或者0次。上面我们的正则出问题是因为 只有结尾小数点的时候没处理,我们把小数点单独括起来。然后数字设置成出现一次或者0次,完美解决问题
注:?在正则中代表{0,1}出现1一次或者不出现
然后不管怎么输入,都能正常触发EditFinished 信号,然后外界再获取到的内容就是我们去除了空格的字符串内容