PyQt5设置QLineEdit限制输入数字
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使用方法大全》介绍过这个方法,通过掩码字符来实现不同格式需求。
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_())