如何为QtWidgets.QLineEdit合并两种输入验证器?QDoubleValidator报错
修复QLineEdit组合验证器的问题
错误原因分析
你遇到的Unexpected argument(s)错误,是因为QDoubleValidator的构造函数不支持直接传入notation关键字参数,这个属性需要通过setNotation()方法单独设置。另外,连续调用field.setValidator()会直接覆盖之前设置的正则验证器,所以两个验证器根本不会同时生效。
修复方案:自定义组合验证器
要同时实现正则格式校验和数值范围校验,需要自定义一个QValidator子类,在validate()方法里同时执行两个验证器的校验逻辑。
完整修复代码
from PyQt5.QtGui import QValidator, QRegExpValidator, QRegExp, QDoubleValidator from PyQt5.QtWidgets import QLineEdit class CombinedValidator(QValidator): def __init__(self, min_val, max_val, decimals=2, parent=None): super().__init__(parent) # 初始化正则验证器:限制为带正负号、固定小数位数的数字格式 self.reg_exp = QRegExp(f"([+-]?)[0-9]+\\.[0-9]{{{decimals}}}") self.reg_validator = QRegExpValidator(self.reg_exp, self) # 初始化数值范围验证器 self.double_validator = QDoubleValidator(min_val, max_val, decimals, self) self.double_validator.setNotation(QDoubleValidator.StandardNotation) def validate(self, input_str, pos): # 第一步:校验输入格式是否符合正则规则 reg_state, reg_str, reg_pos = self.reg_validator.validate(input_str, pos) if reg_state != QValidator.Acceptable: return reg_state, reg_str, reg_pos # 第二步:格式合法后,校验数值是否在指定范围内 double_state, double_str, double_pos = self.double_validator.validate(input_str, pos) return double_state, double_str, double_pos # 调用方法给QLineEdit设置组合验证器 def setup_validator(field: QLineEdit, e_min, e_max, e_komma=2): validator = CombinedValidator(e_min, e_max, e_komma) field.setValidator(validator)
代码说明
- 自定义
CombinedValidator继承自QValidator,内部同时维护正则验证器和数值范围验证器 validate()方法先检查输入格式,格式通过后再校验数值范围,确保两个规则同时生效- 数值验证器的
notation通过setNotation()方法单独设置,规避构造参数错误 - 调用
setup_validator方法即可给目标QLineEdit设置组合验证器,不会出现覆盖问题
内容的提问来源于stack exchange,提问作者derSkorpion12
相关产品推荐
相关产品推荐

