• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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

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

    您可能感兴趣的文章:
    • PyQt5 QLineEdit输入的子网字符串校验QRegExp实现
    • PyQt5 文本输入框自动补全QLineEdit的实现示例
    • python GUI库图形界面开发之PyQt5单行文本框控件QLineEdit详细使用方法与实例
    • PyQt5实现QLineEdit添加clicked信号的方法
    • 在pyqt5中QLineEdit里面的内容回车发送的实例
    上一篇:Pandas 连接合并函数merge()详解
    下一篇:浅谈Pandas dataframe数据处理方法的速度比较
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    PyQt5实现QLineEdit正则表达式输入验证器 PyQt5,实现,QLineEdit,正则,