Python-Pyqt6之QIntValidator,QDoubleValidator无法限制数值范围的正则表达式解决方案

本文介绍如何在PyQt6中使用QLineEdit组件配合QRegularExpressionValidator实现精确的数值输入验证,包括限定整数及浮点数的有效范围。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用Pyqt6进行GUI设计的时候,在需要输入数值(整型,浮点型)的时候选择使用了QLineEdit这个组件控件(详情介绍:QLineEdit组件详情)。QLineEdit自带的setValidator包含 QIntValidatorQDoubleValidatorQRegularExpressionValidator。但在使用过程中,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})

  1.  \.             表示匹配小数点这个字符(如果不写\,则会匹配任意字符如abc等)
  2.  \d{1}       表示1位数字。可以理解为小数点后面只接一位数字。同理\d{2}便是小数点后两位。
  3. 因此\d(\.\d{1})即可表示从0到9.9的小数,再用  把10加上就可以生成0到10的一位小数浮点值输入。
  4.  ?      表示可以用来保证浮点数前后的数字能够匹配到。举例说明,假设目前有输入字符串为94.14,按照我们的限制应该分解成9、4.1、4。如果没有?,那么只会读出4.1,读不出前后的9和4。

以上便是0.1~10浮点数正则表达式的书写规则了。

(注:使用这种方式无可避免出现能输入0.0的情况)


总的来说, 这个问题从pyqt5到pyqt6都有,看一些答案是因为需要重载。但有时候QLineEdit这个输入问题只是某一小块环节的问题,因此在用正则表达式能解决的情况下就不过多探讨其他可能性了。

也许以后有时间会去研究?Maybe~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值