通过验证器,可以对QLineEdit内容进行是否符合要求的验证,本文先补充了validator类的基本知识,然后通过一个案例对验证器的具体使用进行了讲解,并对可能出现的错误进行了修正。需要了解fixup函数,对内容进行修正。

验证器validator的基础知识

  • 设置验证器:setvalidator(QValidator)

QValidator是一个验证器类型,用于检验用户输入的数据的合法性。如果一个输入框设置了验证器,到时用户在文本框中输入内容时,首先会将内容传递给验证器进行验证,如果输入框结束输入后,上述的验证状态并非有效,则会调用修复方法。

validator(self, input_text, pos):

  • return (QValidator.Acceptable, p_str, p_int) : 验证通过
  • return (QValidator.Invalid, p_str, p_int):暂不判定是否通过
  • return (QValidator.Intermediate, p_str, p_int):验证不通过

对文本进行修正:

  • fixup(self,input_text) ——> return 修正后文本

QValidator是一个抽象类,可以自定义子类,也可以使用系统提供的子类。系统提供的子类有:

  • QIntValidator(bottom, top, parent) :限制整形数据范围
  • QDoubleValidator:浮点类型数据范围限制
  • QRegExpValidator:通过正则表达式限定

自定义子类

验证器案例实现方式1-自定义抽象类

现在,做一个小案例,要求一个文本框,里面输入的数值在18~180之间。要求在输入的时候一边输入一边监听。

下面的代码是通过自定义子类的方式进行写的:

# -*- coding: UTF-8 -*-
from PyQt5.Qt import *


class AgeValidator(QValidator):
    def validate(self, input_str, input_int):
        # input_str是输入的内容
        # input_int是光标的位置
        print(input_str, input_int)

        # 首先应该判定结果字符串应该全部由数字组成
        try:
            if 18 <= int(input_str) <= 180:
                # 需要有一个返回值
                return QValidator.Acceptable, input_str, input_int  # 返回验证通过
            elif 1 <= int(input_str) <= 17:
                return QValidator.Intermediate, input_str, input_int  # 返回验证中间状态,不做响应
            else:
                return QValidator.Invalid, input_str, input_int  # 返回验证不通过
        except:
            if len(input_str) == 0:
                return QValidator.Intermediate, input_str, input_int  # 返回验证中间状态,不做响应
            return QValidator.Invalid, input_str, input_int  # 返回验证不通过

    # fixup会对 编辑框结束输入之后 进行再次检查
    def fixup(self, p_str):
        try:
            if int(p_str) < 18:
                return "18"
            return "180"
        except:
            return "18"


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("验证器的使用")
        self.resize(500, 500)
        self.setup_ui()

    def setup_ui(self):
        le = QLineEdit(self)
        le.move(100, 100)
        # 18-180
        # QValidator不能直接用,而是用一个子类来继承,然后实体化
        # 因此上面写了一个新的AgeValidator继承于QValidator
        validator = AgeValidator()
        le.setValidator(validator)

        # le2是为了诱发le的编辑结束状态
        le2 = QLineEdit(self)
        le2.move(200, 200)


# 方便在模板里进行调试
if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

验证器案例实现方式2-借用系统提供的子类

上面已经提到过,系统提供了三个子类:

  • QIntValidator(bottom, top, parent) :限制整形数据范围
  • QDoubleValidator:浮点类型数据范围限制
  • QRegExpValidator:通过正则表达式限定

依旧实现案例:要求一个文本框,里面输入的数值在18~180之间。要求在输入的时候一边输入一边监听。

由于是整型,主要是用到QIntValidator(bottom, top, parent),但是这个api有个缺点,就是只能限制最小值而不能限制最大值,因为对于输入的中间状态没有进行处理。下面一起看看如何使用QIntValidator来对输入的值进行判断并修补bug。

# -*- coding: UTF-8 -*-
from PyQt5.Qt import *


class MyAgeValidator(QIntValidator):
    def fixup(self, p_str):
        print("xxx", p_str)
        if len(p_str) == 0 or int(p_str) < 18:
            # 注意这个顺序,要是写 int(p_str) < 18 or len(p_str) == 0是有问题的
            return "18"


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("验证器的使用")
        self.resize(500, 500)
        self.setup_ui()

    def setup_ui(self):
        le = QLineEdit(self)
        le.move(100, 100)
        # 18-180
        # QValidator不能直接用,而是用一个子类来继承,然后实体化
        # 因此上面写了一个新的AgeValidator继承于QValidator
        validator = MyAgeValidator(18, 180)
        le.setValidator(validator)

        # le2是为了诱发le的编辑结束状态
        le2 = QLineEdit(self)
        le2.move(200, 200)


# 方便在模板里进行调试
if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

文本框的验证


博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/validator.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 09 月 03 日
如果觉得我的文章对你有用,请随意赞赏