QLineEdit结合正则表达式进行输入匹配的时候有可能看似无法正确发出editingFinished信号,导致相应的槽函数不被触发。
例如有下面这样的正则表达式:
QRegExp dRx0_400_P1(“(400[.]{1,1}[0]{0,1})|([1-3]{0,1}[0-9]{1,2}[.]{1,1}[0-9]{0,1})”);
这是一个判断输入是否为0~400之间带有两位小数的数字的正则表达式。连接editingFinished信号和槽,会发现,当你输入类似“xx.x”之类数据时能够正确触发槽函数,但是输入类似为“xx”或“xx.”这样的数据后。即便光标离开了QLineEdit,也不会触发槽函数执行。
这是因为,输入的数据虽然看似”在0~400“之间,但是并没有包含小数点和小数部分,因此,虽然在允许输入范围内,但是并不与正则表达式匹配,正则表达式返回false。可以理解为:虽然光标离开了该QLineEdit,但是Qt认为与正则表达式不匹配,就意味着用户输入不完整,因此不输入编辑完毕(editingFinished)状态,所以不触发editingFinished信号。
若将正则表达式修改为:
QRegExp dRx0_400_P1(“(400)|(400[.]{1,2})|([1-3]{0,1})”);
则在输入“xx.x”、“xx”或“xx.”这样的数据后正则表达式都匹配,这种情况下,光标一旦离开QLineEdit,立刻发出editingFinished信号。
因此,editingFinished信号的触发条件并不是光标离开QLineEdit,而是输入的数据完整并且光标离开编辑区。也就是用户真正的完成了输入后才会触发该信号。