Python GUI编程网 > PyQt5控件_PyQt5控件方法大全 > PyQt5设置QLineEdit限制输入数字
python教程

PyQt5设置QLineEdit限制输入数字

发布博客:2022年12月2日 07:16
阅读:358
作者:Python GUI编程网

PyQt5设置QLineEdit限制输入数字的实现方法有很多种,最先想到的就是通过正则来预先做判断,这个就不讲解了,我要讲的是PyQt给我们提供的方法。PyQt通过一个抽象类QValidator来实现我们的要求,既然是一个抽象类我们可以子类化,也可以直接使用其预设的子类来实现。

PyQt5设置QLineEdit限制输入数字的实现方法有很多种,最先想到的就是通过正则来预先做判断,这个就不讲解了,我要讲的是PyQt给我们提供的方法。PyQt通过一个抽象类QValidator来实现我们的要求,既然是一个抽象类我们可以子类化,也可以直接使用其预设的子类来实现。

在设置QLineEdit限制输入数字之前我们要先了解一下数字有几种,很多人都知道有整形和浮点型,但是还有一种应用场景也要用到数字限制,比如输入区号+电话号码、IP地址、软件激活码等等,不仅有其自己的格式还有字符个数限制。我们一个一个来详细讲解一下。

1. QLineEdit限制输入数字为整形

借助于QValidator的三种方法来处理:Acceptable,Intermediate,Invalid,所以先用QValidator来实例化一个子类,使用内部的validate方法来做处理。

比如我们要输入的数字是18-180之间,如果通过QValidator的处理方式来解决,我们在输入的时候会出现5个问题:验证合法;不合法;没有输入完成暂不验证;没有输入完成删除字符串会出错;光标离开时如果输入不合法依然显示。文章不方便拆分讲解,有需要可以借助视频更加深刻的理解,下面直接贴代码,注意注释内容。

from PyQt5.Qt import *
 import sys
 
 
 class AgeValidator(QValidator):  # QValidator是抽象类,先自定义一个子类
     def validate(self, input_str, pos_int):
         '''
         这里验证数字是不是在18-180之间
         QValidator处理方式有三种:Acceptable,Intermediate,Invalid
         输入过程中会出现以下5种情况:
         验证合法、不合法、没有输入完成暂不验证、没有输入完成删除字符串会出错,光标离开时如果输入不合法依然显示
         '''
         try:  # 防止用户输入不是数字,也可以使用正则进行处理
             if 18 <= int(input_str) <= 180:
                 return (QValidator.Acceptable, input_str, pos_int)  # 在18-180之间直接验证合法
             elif 1 <= int(input_str) <= 17:
                 return (QValidator.Intermediate, input_str, pos_int)  # 没有完全输入结束,暂不验证
             else:
                 return (QValidator.Invalid, input_str, pos_int)  # 验证不合法
         except:  # 如果不是数字按下面流程处理
             if len(input_str) == 0:  # 如果输入字符为零,或删除输入字符
                 return (QValidator.Intermediate, input_str, pos_int)
             return (QValidator.Invalid, input_str, pos_int)
 
     def fixup(self, input_str):  # 光标离开时如果输入不合法依然显示,这是需要用fixup方法来修复
         '''修复方法的出发是光标或焦点是否离开决定'''
         try:
             if int(input_str) < 18:  # 如果输入小于18,直接返回18
                 return '18'
             return '180'  # 如果输入大于180,直接返回180
         except:
             return '18'
 
 
 class Window(QWidget):
     def __init__(self):
         super().__init__()
         self.setWindowTitle("数字验证器 - PyQt5中文网")
         self.resize(600, 500)
         self.func_list()
 
     def func_list(self):
         self.func()
 
     def func(self):
         led = QLineEdit(self)
         led.resize(150, 45)
         led.move(100, 100)
 
         btn = QPushButton('按钮', self)
         btn.move(100, 200)
         led.resize(80, 40)
 
         vadidator = AgeValidator()  # 创建一个验证器对象
         led.setValidator(vadidator)  # 把验证器对象交给单行文本框setValidator方法中
 
 
 if __name__ == '__main__':
     app = QApplication(sys.argv)
     window = Window()
 
     window.show()
     sys.exit(app.exec_())

上面是整型的处理方法,浮点型类似,就不详细讲解了,只要把判断条件改一下就可以了。

2.数字掩码设置

在前面的文章《QLineEdit使用方法大全》介绍过这个方法,通过掩码字符来实现不同格式需求。

QLineEdit

from PyQt5.Qt import *
 import sys
 
 
 class Window(QWidget):
     def __init__(self):
         super().__init__()
         self.setWindowTitle("数字验证器 - PyQt5中文网")
         self.resize(600, 500)
         self.func_list()
 
     def func_list(self):
         self.func()
 
     def func(self):
         led = QLineEdit(self)
         led.resize(150, 45)
         led.move(100, 100)
 
         led.setInputMask('>AAAA-9A')
         led.setInputMask('9999-9999999')  # 固话号码
 
 
 if __name__ == '__main__':
     app = QApplication(sys.argv)
     window = Window()
 
     window.show()
     sys.exit(app.exec_())