返回顶部
首页 > 资讯 > 后端开发 > Python >PyQt5实现QLineEdit正则表达式输入验证器
  • 463
分享到

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

2024-04-02 19:04:59 463人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

本文主要介绍了QLineEdit正则表达式输入验证器,分享给大家,具体如下: from PyQt5 import QtWidgets, QtCore, QtGui, Qt imp

本文主要介绍了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验证器内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: PyQt5实现QLineEdit正则表达式输入验证器

本文链接: https://lsjlt.com/news/122985.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • PyQt5实现QLineEdit正则表达式输入验证器
    本文主要介绍了QLineEdit正则表达式输入验证器,分享给大家,具体如下: from PyQt5 import QtWidgets, QtCore, QtGui, Qt imp...
    99+
    2024-04-02
  • 正则表达式基础与常用验证表达式
    目录一、正则元字符1、 字符元字符2、重复元字符(量词)3、定位元字符4、分组和替换字符5、特殊字符6、需要转义的字符7、贪婪与非贪婪匹配8、常见正则表达式二、正则表达式应用举例1、...
    99+
    2024-04-02
  • PyQt5 QLineEdit输入的子网字符串校验QRegExp实现
    自己编写的用于对lineEdit编辑框输入的子网,例如:192.168.60.1/24字符串校验是否合规。 # 限制lineEdit编辑框只能输入./字符和数字 reg = Q...
    99+
    2024-04-02
  • JS如何实现身份证信息验证正则表达式
    小编给大家分享一下JS如何实现身份证信息验证正则表达式,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!很多时候我们都是通过一组正则...
    99+
    2024-04-02
  • Shell正则表达式验证IP地址
    本机多个IP ifconfig | awk '/inet/{print $2}' | awk -F: '{print $2}' 首先,先用这个来着 CheckIPAddress() ...
    99+
    2022-06-04
    地址 正则表达式 Shell
  • JS如何通过正则表达式实现验证功能
    这篇文章主要为大家展示了“JS如何通过正则表达式实现验证功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JS如何通过正则表达式实现验证功能”这篇文章吧。1、验...
    99+
    2024-04-02
  • 只能输入正整数的正则表达式及常用的正则表达式
    只能输入正整数的正则表达式:^[1-9]\d*$常用的正则表达式:1. 匹配手机号码:^[1][3,4,5,7,8,9]\d{9}$...
    99+
    2023-08-16
    正则表达式
  • 详解正则表达式之数字验证
    正则表达式可以用来验证字符串是否符合特定的格式要求。在数字验证中,我们可以使用正则表达式来验证字符串是否只包含数字字符。以下是一个基...
    99+
    2023-08-15
    正则表达式
  • js输入框如何使用正则表达式校验输入内容
    这篇文章将为大家详细讲解有关js输入框如何使用正则表达式校验输入内容,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。源码如下所示: <!DOCTYPE&nb...
    99+
    2024-04-02
  • js如何使用正则表达式验证表单
    这篇文章给大家分享的是有关js如何使用正则表达式验证表单的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。效果图:图(1)初始图图(2)填入信息校验代码如下:<!DOCTYPE...
    99+
    2024-04-02
  • Python验证的50个常见正则表达式
    什么是正则表达式? 正则表达式(Regular Expression)通常被用来检索、替换那些符合某个模式(规则)的文本。 此处的Regular即是规则、规律的意思,Regular...
    99+
    2024-04-02
  • web正则表达式基础与常用验证表达式是什么
    这篇文章主要介绍了web正则表达式基础与常用验证表达式是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇web正则表达式基础与常用验证表达式是什么文章都会有所收获,下面我们一起来看看吧。一、正则元字符是一些在...
    99+
    2023-07-02
  • Linux中如何实现验证邮件地址的正则表达式
    这篇文章主要介绍Linux中如何实现验证邮件地址的正则表达式,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!邮件地址的规范来自于 RFC 5322 。有一个网站 emailregex.com 专门列...
    99+
    2023-06-16
  • javascript正则表达配置扩展名并实现验证
    项目需求: 1.通过下拉菜单,可配置包含或者不包含某个字符串的文件名,字符串支持输入;必须以.xml为结尾2.可动态添加、删除配置行;3.点击【开始生成】按钮,根据配置的扩展名生成相...
    99+
    2024-04-02
  • ASP.NETMVC使用正则表达式验证手机号码
    在ASP.NET MVC中,可以使用RegularExpression特性来验证手机号码。 public class Customer { [Requ...
    99+
    2024-04-02
  • 怎么用Shell正则表达式验证IP地址
    这篇文章主要讲解了“怎么用Shell正则表达式验证IP地址”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Shell正则表达式验证IP地址”吧!本机多个IP 代码如下:ifconfig ...
    99+
    2023-06-09
  • 如何在 Golang 中用正则表达式验证 JSON?
    如何在 go 中使用正则表达式验证 json?定义正则表达式模式,确保字符串以花括号开头,包含键值对,键用引号括起,值可以是字符串、数组或嵌套对象。使用正则表达式包编译正则表达式。检查 ...
    99+
    2024-05-13
    正则表达式 json验证 golang 键值对
  • js输入框使用正则表达式校验输入内容的示例分析
    这篇文章主要介绍了js输入框使用正则表达式校验输入内容的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。js输入框输入校验 func...
    99+
    2024-04-02
  • 微信小程序如何实现input正则表达式验证功能
    小编给大家分享一下微信小程序如何实现input正则表达式验证功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体如下:1、效果...
    99+
    2024-04-02
  • javascript手机验证、邮箱验证、密码验证的正则表达式简单封装实例
    javascript【手机验证】、【邮箱验证】、【密码验证】的正则表达式的封装: 【手机验证】: 以下代码是验证手机号码的正则表达式的方法, 【checkPhone】:表示的是方法的...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作