PyQt5 QLineEdit验证器 PyQt5实现QLineEdit正则表达式输入验证器
鱼子酱126 人气:0想了解PyQt5实现QLineEdit正则表达式输入验证器的相关内容吗,鱼子酱126在本文为您仔细讲解PyQt5 QLineEdit验证器的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:PyQt5,QLineEdit验证器,PyQt5,QLineEdit校验,下面大家一起来学习吧。
本文主要介绍了QLineEdit正则表达式输入验证器,分享给大家,具体如下:
from PyQt5 import QtWidgets, QtCore, QtGui, Qt import re ############## QLineEdit正则表达式输入验证器 class LineEditRegExpValidator(QtGui.QValidator): ''' # 默认为科学计数法输入验证器 用法 SciNotValidator = LineEditRegExpValidator() # 创建一个QLineEdit正则表达式输入验证器的类,默认为科学计数法输入验证器 self.LineEdit1.setValidator(SciNotValidator) # 设置验证器(启用) self.LineEdit1.installEventFilter(SciNotValidator) # QLineEdit清空内容且游标失焦时,自动填充上一次的字符串内容 self.LineEdit2.setValidator(SciNotValidator) self.LineEdit2.installEventFilter(SciNotValidator) self.LineEdit3.setValidator(SciNotValidator) self.LineEdit3.installEventFilter(SciNotValidator) Validator.validate() is abstract and must be overriddenValidator.validate() is abstract and must be overridden ''' def __init__( self, # 编辑状态框输入结束允许的字符串 fullPatterns=[ r"[+|-]?[0-9]+\.?[0-9]*(?:[Ee][+|-]?[0-9]+)?", r'[+|-]{0,1}nan', r'[+|-]{0,1}inf' ], # 编辑状态框输入尚未结束允许的字符串 partialPatterns=[ r'[+|-]?[0-9]+\.?[0-9]*(?:[Ee][+|-]?)?', r'-', r'\+', r'[+|-]{0,1}nan', r'[+|-]{0,1}na', r'[+|-]{0,1}n', r'[+|-]{0,1}inf', r'[+|-]{0,1}in', r'[+|-]{0,1}i' ], fixupString='1.0' ): super(LineEditRegExpValidator, self).__init__() self.fullPatterns = fullPatterns self.partialPatterns = partialPatterns self.fixupString = fixupString # 实时监听文本框的改变 # 可能是键盘单个字符'n'输入, 也有可能是粘贴多个字符'nan'输入 def validate(self, string, pos) -> QtGui.QValidator.State: # string为编辑状态框中可见的字符串+输入字符/字符串 # 编辑过程结束,若返回True,将编辑状态框中的字符串填入LineEdit,若返回Flase则自动调用self.fixup方法,将fixup方法返回的字符串填入LineEdit if self.acceptable_check(string): #print(f'QtGui.QValidator.Acceptable:{QtGui.QValidator.Acceptable}') return QtGui.QValidator.Acceptable, string, pos # QtGui.QValidator.Acceptable = 2; # 编辑过程中允许出现的字符串 if self.intermediate_check(string): #print(f'QtGui.QValidator.Intermediate:{QtGui.QValidator.Intermediate}') return QtGui.QValidator.Intermediate, string, pos # QtGui.QValidator.State = 1; # 编辑过程中不允许出现的字符串(本次输入的单个字符或字符串无效) else: #print(f'QtGui.QValidator.Invalid:{QtGui.QValidator.Invalid}') return QtGui.QValidator.Invalid, string, pos # 编辑状态框验证通过, 编辑状态框单个字输入符成功 def acceptable_check(self, string) -> bool: True_ = 0 for fullPattern in self.fullPatterns: if re.fullmatch(fullPattern, string): True_ += 1 else: continue if True_ != 0: return True else: return False # 输入还未结束允许的字符串 def intermediate_check(self, string): #-> bool; string为编辑状态框中可见的字符串 """ Checks if string makes a valid partial float, keeping in mind locale dependent decimal separators. """ if string == '': return True for partialPattern in self.partialPatterns: if re.fullmatch(partialPattern, string): return True else: pass # def eventFilter(self, lineEdit, event): # -> bool # FocusIn event # 每当fous in时,更新LineEditRegExpValidator的fixupString # 输入验证器 ''' SciNotValidator = LineEditRegExpValidator() self.LineEdit1.setValidator(SciNotValidator) self.LineEdit1.installEventFilter(SciNotValidator) ''' if event.type() == QtCore.QEvent.FocusIn: # do custom stuff # print('focus in') # self.lineEdit_zhuansu.installEventFilter(SciNotValidator), 在本类中,widget是self.lineEdit,执行函数self.lineEdit.text(), 其它类不一定有text()方法 #lineEdit.selectAll() QtCore.QTimer.singleShot(0, lineEdit.selectAll) # 0ms self.fixupString = lineEdit.text() #print(self.fixupString) # return False so that the lineEdit will also handle the event # otherwise it won't focus out return False else: # we don't care about other events return False # 重写QValidator的fixup(str)方法。可以在切换焦点后,直接修改不合规则的字符串。参数str是经过validate()方法验证后的字符串; def fixup(self, string) -> str: """ Fixes up input text to create a valid float. Puts an empty string on failure. """ print(string) True_ = 0 for fullPattern in self.fullPatterns: if re.fullmatch(fullPattern, string): True_ += 1 else: continue if True_ != 0: return string else: return self.fixupString # listWidget、tableWidget输入数据检查 class LineEditDelegate_Regx(QtWidgets.QStyledItemDelegate): # 科学计数法正则表达式 regx = r"-?\ *[0-9]+\.?[0-9]*(?:[Ee]\ *-?\ *[0-9]+)?" # """ -? optionally matches a negative sign (zero or one negative signs) \ * matches any number of spaces (to allow for formatting variations like - 2.3 or -2.3) [0-9]+ matches one or more digits \.? optionally matches a period (zero or one periods) [0-9]* matches any number of digits, including zero (?: ... ) groups an expression, but without forming a "capturing group" (look it up) [Ee] matches either "e" or "E" \ * matches any number of spaces (to allow for formats like 2.3E5 or 2.3E 5) -? optionally matches a negative sign \ * matches any number of spaces [0-9]+ matches one or more digits ? makes the entire non-capturing group optional (to allow for the presence or absence of the exponent - 3000 or 3E3 https://stackoverflow.com/questions/18152597/extract-scientific-number-from-string """ """ 用法: def __init__(self, parent=None): super(NewClassName, self).__init__(parent) self.setupUi(self) delegate = LineEditDelegate_Regx(regx=None) self.listWidget_ShuZhiLieBiao.setItemDelegate(delegate) self.tableWidget.setItemDelegate(delegate) """ def __init__(self, regx=None, parent=None): super(LineEditDelegate_Regx, self).__init__(parent) if regx == None: pass else: self.regx = regx # 方法重写 def createEditor(self, parent, option, index): # self, parent, option, index四个参数均不能少 editor_qlineedit = QtWidgets.QLineEdit(parent) #SciNotValidator = QtGui.QRegExpValidator(QtCore.QRegExp(self.regx)) SciNotValidator = LineEditRegExpValidator() editor_qlineedit.setValidator(SciNotValidator) return editor_qlineedit # LineEditDelegate_Regx(regx=None, parent=None), QStyledItemDelegate(parent: QObject = None) """ # LineEdit输入数据检查 def LineEditInputChecking(lineEdit, regx=None): ''' 用法: LineEditInputChecking(lineEdit=self.lineEdit_zhuansu) ''' if regx == None: regx = r"-?\ *[0-9]+\.?[0-9]*(?:[Ee]\ *-?\ *[0-9]+)?" reg_ex = QtCore.QRegExp(regx) input_validator = QtGui.QRegExpValidator(reg_ex, lineEdit) lineEdit.setValidator(input_validator) """
参考:
https://stackoverflow.com/questions/39202697/qt-qlineedit-input-validation
https://stackoverflow.com/questions/15829782/how-to-restrict-user-input-in-qlineedit-in-pyqt
加载全部内容