在使用Pyqt6进行GUI设计的时候,在需要输入数值(整型,浮点型)的时候选择使用了QLineEdit这个组件控件(详情介绍:QLineEdit组件详情)。QLineEdit自带的setValidator包含 QIntValidator, QDoubleValidator, QRegularExpressionValidator。但在使用过程中,QIntValidator和QDoubleValidator在限制整数或者小数时无法正确应用。搜寻后使用正则表达式QRegularExpressionValidator 则能解决问题。
现在记录一下避免今后再遇到这种问题。
1.以限制输入0-50的正整数为例,具体代码如下:
reg = QRegularExpression('^([1-4][0-9]?|50|[5-9]|0)$') # 正则表达式范围 0~50
validator = QRegularExpressionValidator() # 创建validator
validator.setRegularExpression(reg) # 设置validator范围
self.QLinetextEdit.setValidator(validator) # 对应的QLineEdit激活validator
正整数的正则表达式比较容易直接从网上搜索到,不用花费太多时间在上面。一个比较实用的查询正整数正则表达式网址:数字范围正则表达式生成。
2. 以限制输入0.1-10的浮点数为例,具体代码如下:
reg = QRegularExpression('^(\d(\.\d{1})?|10)$')
validator = QRegularExpressionValidator()
validator.setRegularExpression(reg)
self.QlinetextEdit.setValidator(validator)
先简要解释下正则表达式的含义:
^: 匹配字符串的开始
$: 匹配字符串的结束
\d: 匹配数字
. :匹配除换行符以外的任意字符
{n}:重复n次
?: 重复零次或一次
| :或。可以把不同的子表达式合成一个总表达式
现在就可以来看看 ^(\d(\.\d{1})?|10)$ 的含义了:
首先看^.......$之间的代码段,其中第一个()可以忽略,从\d开始,表示匹配的是数字。再看\d后接的第二个()里的内容:(\.\d{1})
- \. 表示匹配小数点这个字符(如果不写\,则会匹配任意字符如abc等)
- \d{1} 表示1位数字。可以理解为小数点后面只接一位数字。同理\d{2}便是小数点后两位。
- 因此\d(\.\d{1})即可表示从0到9.9的小数,再用 | 把10加上就可以生成0到10的一位小数浮点值输入。
- ? 表示可以用来保证浮点数前后的数字能够匹配到。举例说明,假设目前有输入字符串为94.14,按照我们的限制应该分解成9、4.1、4。如果没有?,那么只会读出4.1,读不出前后的9和4。
以上便是0.1~10浮点数正则表达式的书写规则了。
(注:使用这种方式无可避免出现能输入0.0的情况)
总的来说, 这个问题从pyqt5到pyqt6都有,看一些答案是因为需要重载。但有时候QLineEdit这个输入问题只是某一小块环节的问题,因此在用正则表达式能解决的情况下就不过多探讨其他可能性了。
也许以后有时间会去研究?Maybe~