您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:PyQt5实现QLineEdit正则表达式输入验证器

51自学网 2021-10-30 22:46:27
  python
这篇教程PyQt5实现QLineEdit正则表达式输入验证器写得很实用,希望能帮到您。

本文主要介绍了QLineEdit正则表达式输入验证器,分享给大家,具体如下:

from PyQt5 import QtWidgets, QtCore, QtGui, Qtimport 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

到此这篇关于PyQt5实现QLineEdit正则表达式输入验证器的文章就介绍到这了,更多相关PyQt5 QLineEdit验证器内容请搜索51zixue.net以前的文章或继续浏览下面的相关文章希望大家以后多多支持51zixue.net!


Pandas 连接合并函数merge()详解
浅谈Pandas dataframe数据处理方法的速度比较
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。