【pyqt5】QLineEdit中的文本输入限制方式,输入校验规则的应用详解

news2024/9/19 20:42:06

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,前后端开发,小程序开发,云原生K8S,人工智能,js逆向,App逆向,网络系统安全,数据分析,PyQt5和tkinter桌面开发,Django,fastapi,flask等框架,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:PyQt5桌面应用开发,零基础到进阶应用实战
景天的主页:景天科技苑

在这里插入图片描述

文章目录

  • PyQt5中QLineEdit的输入检验
    • 一、QLineEdit基础
      • 1. 示例代码:创建基本的QLineEdit
    • 二、文本输入限制
      • 1. 最大长度限制
      • 2. 只读限制
    • 三、校验器(Validator)
      • 1. 校验器类型
      • 2. 示例:限制整数输入
      • 3. 示例:限制浮点数输入
      • 4. 示例:使用正则表达式限制输入
      • 5. 示例:年龄输入范围限制
    • 四、使用掩码(Input Mask)
      • 1. 掩码字符说明
      • 2. 设置掩码方式
      • 3. 示例:IP地址输入掩码
      • 4. 示例:其他类型的掩码
    • 五、总结

PyQt5中QLineEdit的输入检验

在PyQt5开发桌面应用程序时,QLineEdit是一个常用的控件,用于单行文本输入。然而,在实际应用中,经常需要对用户的输入进行校验,以确保数据的正确性和程序的健壮性。本文将结合实际案例,详细介绍PyQt5中QLineEdit的输入检验方法,包括使用校验器(Validator)、掩码(Input Mask)机制。

一、QLineEdit基础

QLineEdit是PyQt5中用于单行文本输入的控件。它允许用户输入和编辑文本,并支持多种样式和验证方式。在使用QLineEdit之前,首先需要导入必要的PyQt5模块,并创建一个QApplication对象来管理应用程序的事件循环。

1. 示例代码:创建基本的QLineEdit

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QVBoxLayout

class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('QLineEdit 示例')
        self.setGeometry(100, 100, 280, 80)

        layout = QVBoxLayout()

        self.line_edit = QLineEdit(self)
        self.line_edit.setPlaceholderText("请输入文本...")

        layout.addWidget(self.line_edit)

        self.setLayout(layout)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MyWidget()
    ex.show()
    sys.exit(app.exec_())

在上述代码中,我们创建了一个包含QLineEdit的简单窗口,并设置了占位符文本。

二、文本输入限制

主要用于作为开发人员,设定限制规则,来限制用户在文本框中输入的内容,比如限制只能输入数字,数字最大长度等等
相关api介绍
在这里插入图片描述

1. 最大长度限制

#设置最长输入限制,最多输入三个字符,再多了输入不进去了
le_login.setMaxLength(3)
在这里插入图片描述

#获取文本框最大输入长度
print(le_login.maxLength())
在这里插入图片描述

2. 只读限制

设置了只读限制,无法修改文本框里面的内容

#设置只读
le_login.setReadOnly(True)
#设置了只读,但是可以通过代码输入内容
le_login.setText(“我来了”)
在这里插入图片描述
但是通过代码设置也不能超越设置的最大长度
在这里插入图片描述

三、校验器(Validator)

1. 校验器类型

通过设定的规则来验证用户输入的内容的合法性
PyQt5提供了多种校验器(Validator)来限制QLineEdit的输入。常用的校验器包括:

  • QIntValidator:用于限制输入为整数。
  • QDoubleValidator:用于限制输入为浮点数。
  • QRegExpValidator:使用正则表达式限制输入。
    在这里插入图片描述
    QValidator是一个抽象类,在实现它的时候,需要子类化此类
    实现两个方法,validate和fix方法

2. 示例:限制整数输入

from PyQt5.QtGui import QIntValidator

# 假设line_edit为已经创建的QLineEdit实例
int_validator = QIntValidator()
int_validator.setRange(1, 100)  # 设置整数的范围
line_edit.setValidator(int_validator)

在上述代码中,我们创建了一个QIntValidator实例,并设置了整数的范围为1到100。然后,我们将这个校验器与QLineEdit实例绑定,以限制用户只能输入这个范围内的整数。

3. 示例:限制浮点数输入

from PyQt5.QtGui import QDoubleValidator

double_validator = QDoubleValidator()
double_validator.setRange(-100.0, 100.0)  # 设置浮点数的范围
double_validator.setNotation(QDoubleValidator.StandardNotation)  # 设置标准显示方式
double_validator.setDecimals(2)  # 设置小数点后的位数
line_edit.setValidator(double_validator)

在上述代码中,我们创建了一个QDoubleValidator实例,并设置了浮点数的范围为-100.0到100.0,同时设置了标准显示方式和小数点后的位数。

4. 示例:使用正则表达式限制输入

from PyQt5.QtGui import QRegExpValidator
from PyQt5.QtCore import QRegExp

# 使用正则表达式限制输入为数字或字母
reg_exp = QRegExp("[a-zA-Z0-9]+$")
reg_validator = QRegExpValidator(reg_exp)
line_edit.setValidator(reg_validator)

在上述代码中,我们使用了正则表达式"[a-zA-Z0-9]+$"来限制用户只能输入字母和数字,并将这个正则表达式与QLineEdit实例绑定。

5. 示例:年龄输入范围限制

限制输入年龄的范围是18-180,输入字母校验失败,输入小于18的修正为18

from PyQt5.Qt import *


#自定义个类继承QValidator
class AgeVadidator(QValidator):
    #重写validate和fix方法
    #validate方法传进去两个参数,一个是字符串,一个是整形,分别代表输入的内容和光标的位置
    #该方法一定要有返回三个参数,分别是是否验证通过,输入字符串,光标位置
    def validate(self, input_str, pos_int):
        print(input_str, pos_int)

        # 判定
        # 结果字符串, 应该全部都是由一些数字组成
        # return的结果中,input_str就是在文本框显示的内容,我们也可以写死,不管用户输入什么都返回固定值,和固定的光标位置
        #下面代码中有强制类型转换,为了防止报错,我们try一下,只有输入的数数字才能显示
        try:
            if 18 <= int(input_str) <= 180:
                return QValidator.Acceptable, input_str, pos_int
            #输入1-17之间,暂时不做判断
            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

    # fix用来修正数据,当光标离开输入框(结束编辑)之后,根据判断逻辑返回我们设定的值
    # 用来修复处于暂不做设定状态的值,当用户输入完毕,结束编辑之后,如果输入的内容经过validate验证后处于非有效状态
    #就会执行fix函数里面的逻辑
    def fixup(self, p_str):
        print("xxx", p_str)
        try:
            if int(p_str) < 18:
                return "18"
        except:
            return "18"


#自定义个类来继承QIntValidator,重写fix方法来做修复
class MyAgeVadidator(QIntValidator):
    def fixup(self, p_str):
        print("xxx", p_str)
        if len(p_str) == 0 or int(p_str) < 18:
        # if int(p_str) < 18 or len(p_str) == 0:
            return "18"


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QLineEidt验证器的学习")
        self.resize(500, 500)
        self.setup_ui()

    def setup_ui(self):
        le = QLineEdit(self)
        le.move(100, 100)
        # 18 - 180
        vadidator = AgeVadidator()
        # vadidator = QIntValidator(18, 180)
        # vadidator = MyAgeVadidator(18, 180)

        #将验证器传到setValidator方法中
        le.setValidator(vadidator)



        le2 = QLineEdit(self)
        le2.move(200, 200)

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)

    window = Window()
    window.show()


    sys.exit(app.exec_())

当用户输入完1,鼠标光标离开输入框,走fix方法修复,输出18
在这里插入图片描述
当用户输入非数字,不会显示到输入框
在这里插入图片描述
当用户输入12a,鼠标离开,走fix方法,返回18
在这里插入图片描述

四、使用掩码(Input Mask)

除了使用校验器外,PyQt5还提供了掩码(Input Mask)功能来限制QLineEdit的输入。掩码允许你定义输入字段的格式,并在用户输入时自动应用这个格式。
在这里插入图片描述

1. 掩码字符说明

PyQt5的掩码功能支持多种掩码字符,以下是一些常用的掩码字符及其说明:

  • A:ASCII字母字符(大写或小写)是必须输入的(A-Z, a-z)。
  • a:ASCII字母字符(大写或小写)是允许输入的,但不是必需的(A-Z, a-z)。
  • N:ASCII字母数字字符(大写、小写或数字)是必须输入的(A-Z, a-z, 0-9)。
  • n:ASCII字母数字字符(大写、小写或数字)是允许输入的,但不是必需的(A-Z, a-z, 0-9)。
  • X:任何字符都是必须输入的。
  • x:任何字符都是允许输入的,但不是必需的。
  • 9:ASCII数字字符(0-9)是必须输入的。
  • 0:ASCII数字字符(0-9)是允许输入的,但不是必需的。
  • D:ASCII数字字符(1-9)是必须输入的,不允许以0开头。
  • d:ASCII数字字符(1-9)是允许输入的,但不允许以0开头,不是必需的。
  • H:十六进制格式字符(A-F, a-f, 0-9)是必须输入的。
  • h:十六进制格式字符(A-F, a-f, 0-9)是允许输入的,但不是必需的。
  • B:二进制格式字符(0, 1)是必须输入的。
  • b:二进制格式字符(0, 1)是允许输入的,但不是必需的。
  • #:ASCII字符(包括空格)是可以输入的,用于分隔视觉上的元素,不限制输入。
  • >:将所有后续字符转换为大写。
  • <:将所有后续字符转换为小写。
  • !:关闭大小写转换。
  • \:用于转义上面列出的特殊字符。

2. 设置掩码方式

setInputMask(mask_str)
mask_str表示掩码字符串
掩码字符串大致有三部分组成
掩码由一串掩码字符和分隔符组成 + 可选的分号; 和 空白占位字符

3. 示例:IP地址输入掩码


# 0. 导入需要的包和模块
from PyQt5.Qt import *  # 主要包含了我们常用的一些类, 汇总到了一块
import sys


# 1. 创建一个应用程序对象
app = QApplication(sys.argv)


# 2. 控件的操作
# 2.1 创建控件
window = QWidget()


# 2.2 设置控件
#设置窗口标题,默认标题是python,只有顶级控件才可以设置标题栏的标题
window.setWindowTitle("掩码验证")
#设置窗口大小,注意,设置的空间尺寸大小,不包含上面的标题栏
window.resize(500, 500)


# le 设置掩码
# 总共输入5 位
# 左边 2(必须是大写字母) - 右边 2(必须是一个数字)
# > 后面跟的字母都是大写字母
#占位符根据掩码字符表查
#分隔符是 -
#两位大写字母,写俩A即可。两位数字,俩9即可
#分号后面是空白占位符,就是没有输入的时候显示的占位符


#IP地址 XXX.XXX.XXX.XXX
# 由于ip地址的取值范围是0-255,需要借助输入验证


#自定义个类继承QValidator
class PhoneVadidator(QValidator):
    #重写validate和fix方法
    #validate方法传进去两个参数,一个是字符串,一个是整形,分别代表输入的内容和光标的位置
    #该方法一定要有返回三个参数,分别是是否验证通过,输入字符串,光标位置
    def validate(self, input_str, pos_int):
        print(input_str.split("."), pos_int)
        data = input_str.split(".")

        #每个网段都小于255才能通过校验
        if int(data[0]) <=255 and int(data[1]) <=255 and  int(data[2])<=255 and int(data[3])<=255:
            return QValidator.Acceptable, input_str, pos_int

        #其他的校验失败
        else:
            return QValidator.Invalid, input_str, pos_int




#ip地址校验
addr = QLineEdit(window)
addr.move(150, 100)
addr.setInputMask("999.999.999.999;0")
vadidator = PhoneVadidator()
addr.setValidator(vadidator)



# 2.3 展示控件
window.show()



# 3. 应用程序的执行, 进入到消息循环
sys.exit(app.exec_())


在上述代码中,"999.999.999.999;0"是IP地址的输入掩码。其中,9表示必须输入的数字字符,.是IP地址的分隔符,0是占位符,表示在不输入时显示的默认字符(通常是下划线或0,具体取决于平台的实现)。每段的数字最大限制为255。这样,用户就只能按照XXX.XXX.XXX.XXX的格式输入IP地址了。

在这里插入图片描述

4. 示例:其他类型的掩码

  • MAC地址掩码
line_edit.setInputMask("HH:HH:HH:HH:HH:HH;_")

这里H表示十六进制字符(0-9, A-F, a-f),用于MAC地址的输入。

  • 日期掩码
line_edit.setInputMask("0000-00-00")

line_edit.setInputMask("0000-00-00;*")

这里0表示必须输入的数字,用于年月日的输入。*是占位符的另一种表示方式,具体显示可能因平台而异。

  • 许可证号掩码
line_edit.setInputMask(">AAAAA-AAAAA-AAAAA-AAAAA-AAAAA;#")

这里A表示大写字母,>表示将后续字符转换为大写,#是占位符,用于分隔和占位。

五、总结

通过校验器和掩码,PyQt5的QLineEdit控件可以灵活地限制用户的输入,确保数据的正确性和程序的健壮性。在实际开发中,应根据具体需求选择合适的校验方式,并合理设置校验规则或掩码格式。此外,还可以结合信号与槽机制,对用户的输入进行实时监控和处理,进一步提升用户体验和程序的交互性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2058211.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从0到1学会nginx分布式框架

nginx 项目地址晓智科技晓智科技晓智文档晓智文档源码地址源码地址文档源码文档源码 yum 安装 nginx 安装 yum-utils sudo yum install -y yum-utils添加 yum 源文件 # 新建文件 vim /etc/yum.repos.d/nginx.repo # 添加文件源 [nginx-stable] namenginx stable repo ba…

点击展开详细说明网站html引导页源码

点击展开详细说明网站html引导页源码,源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 https://download.csdn.net/download/huayula/89…

开箱即用,使用极空间搭建小清新的自托管个人仪表板『honey』

开箱即用&#xff0c;使用极空间搭建小清新的自托管个人仪表板『honey』 哈喽小伙伴们好&#xff0c;我是Stark-C~ 说到可以在NAS部署的自托管仪表板呀&#xff0c;导航栏呀简直不要太多&#xff0c;光是我之前分享的譬如Sun-Panel &#xff0c;Dashy&#xff0c;HomePage&am…

【Linux】1.Linux环境搭建

文章目录 1.Linux环境安装2.云服务器选择2.1 3个云服务器平台2.2阿里云平台租借云服务器教程 3.Xshell安装4.Xshell配置连接云服务器5.如何多人共享一台Linux云服务器&#xff1f;6.如何更改他人访问云服务器的密码呢&#xff1f;7.如何阻止你共享的人访问云服务器呢&#xff1…

<数据集>RSOD数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;936张 标注数量(xml文件个数)&#xff1a;936 标注数量(txt文件个数)&#xff1a;936 标注类别数&#xff1a;4 标注类别名称&#xff1a;[aircraft, oiltank, overpass, playground] 序号类别名称图片数框数1air…

【轨物推荐】数字化时代的企业技术创新方法论

原创 郭朝晖 蝈蝈创新随笔 2024年08月03日 18:29 上海 数字化转型的一个重要特点&#xff0c;是用数字化技术手段解决企业的技术、运营和管理问题。于是我发现&#xff1a;数字化项目往往既有技术项目的特点、又有工程项目管理的特点&#xff0e;还有创新项目的特点。但换个角…

鲲鹏服务器安装Kafka

由于项目需求&#xff0c;需要在鲲鹏云主机上安装Kafka&#xff0c;并且要求安装的版本为2.3.X。下面主要从以下几个步骤说明如何安装&#xff1a; 1、下载kafka的安装文件 2、上传到服务器 3、修改配置 4、启动 5、使用工具测试 服务器信息 CPU信息 [rootecs02 ~]# lscpu A…

[数据集][目标检测]瞳孔虹膜检测数据集VOC+YOLO格式8768张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;8768 标注数量(xml文件个数)&#xff1a;8768 标注数量(txt文件个数)&#xff1a;8768 标注…

24款保时捷帕拉梅拉升级原厂360全景影像案例

24款保时捷帕拉梅拉升级原厂360全景影像后&#xff0c;车辆的前后左右都能被清晰地拍摄下来&#xff0c;并通过车载屏幕实时显示。这可以帮助驾驶员更好地了解车辆周围的环境&#xff0c;从而提高驾驶安全性和便利性。以下是一些可能的效果展示&#xff1a; • 全景视图&#…

wincc报警如何通过短信发送给手机

单位使用WINCC上位机监控现场&#xff0c;需要把报警信息发送到指定手机上&#xff0c;能否实现&#xff1f;通过巨控GRMOPC系列远程智能控制终端&#xff0c;简单配置即可实现wincc报警短信传送到手机。配置过程无需任何通讯程序&#xff0c;也不要写任何触发脚本。 GRMOPC模…

Vue的遍历(列表、对象、字符串、数字)、key的原理

目录 1 遍历(列表、对象、字符串、数字)2. key的原理2.1 key使用index2.1 key使用数据的唯一id2.3 key的原理 3. 列表过滤4. 列表排序 1 遍历(列表、对象、字符串、数字) key可以使用数据的唯一字段(最好)&#xff0c;也可以使用index(默认) 使用示例: <!DOCTYPE html>…

数据科学已死?

既然有了人工智能&#xff0c;训练自己的机器学习模型是否还值得&#xff1f; 既然有了人工智能&#xff0c;学习 Python 是否还值得&#xff1f; 既然有了人工智能&#xff0c;KNIME 还在营业吗&#xff1f; 既然有了人工智能&#xff0c;数据科学是否仍然需要&#xff1f;…

【深度学习与NLP】——Transformer架构解析

目录 第一章:Transformer背景介绍 1.1 Transformer的诞生 1.2 Transformer的优势 1.3 Transformer的市场 第二章:Transformer架构解析 2.1 认识Transformer架构 2.1.1 Transformer模型的作用 2.1.2 Transformer总体架构图 2.2 输入部分实现 2.2.1 文本嵌入层的作用 …

维护和升级LabVIEW程序

在维护和升级LabVIEW程序时&#xff0c;需要全面考虑代码的现状和未来的需求。以下是各个方面的详细注意事项&#xff0c;以确保程序能够在稳定性和性能方面得到提升。 1. 理解现有代码: 深入代码分析: 仔细阅读现有的代码&#xff0c;了解其逻辑结构、数据流、和控制流程。关注…

众善慈善机构:帮助贫困地区的人们提高自身的就业能力和创业能力

众善慈善机构是一家致力于帮扶和脱贫的慈善机构&#xff0c;主要致力于帮助贫困地区的人们改善生活条件&#xff0c;提高生活质量。 众善慈善机构的主要帮扶对象是贫困地区的儿童、老人和残疾人。他们通过开展各种救助项目&#xff0c;为这些人群提供生活物资、教育、医疗等方面…

【附源码】Python :PYQT界面点击按钮随机变色

系列文章目录 Python 界面学习&#xff1a;PYQT界面点击按钮随机变色 文章目录 系列文章目录一、项目需求二、源代码三、代码分析3.1 导入模块&#xff1a;3.2 定义App类&#xff1a;3.3 构造函数&#xff1a;3.4 初始化用户界面&#xff1a;3.5 设置窗口属性&#xff1a;3.6 …

GDB的基本使用

我有话说 因为时间和精力原因&#xff0c;本文写的虎头蛇尾了&#xff0c;除了启动调试与程序执行以外只有少量截图演示&#xff0c;只是简单的说明。如果有需要可以联系我&#xff0c;我有时间的话会把演示补上&#xff0c;谢谢理解。 启动调试与程序执行 启动调试并传递参数…

哈啰出行Java开发工程师一面面经(校招)

牛客网最新面经分享面试过程&#xff1a; 小编为参加校招、秋招、金九银十面试季的小伙伴们准备了一份很全很详细的java面试宝典&#xff08;包含各个大厂真题以及最常见的八股文含答案&#xff09;&#xff0c;由于平台篇幅原因&#xff0c;就不在这里一一展示了&#xff0c;…

企业高性能web服务器之nginx篇

文章目录 Nginx核心配置location 使用详情location之精确匹配location之区分大小写location之不区分大小写location之文件名后缀 Nginx账户认证功能自定义错误页面自定义错误日志检测文件是否存在长连接下载服务器 Nginx高级配置Nginx的状态页Nginx 压缩功能Nginx 变量使用Ngin…

5G+智慧农业大数据解决方案

1. 5G智慧农业大数据概述 5G智慧农业大数据方案融合5G网络、大数据等技术&#xff0c;推动农业向智能化、信息化发展。方案包含农产品质量追溯、农业物联网、电子商务、休闲农业等多个平台&#xff0c;全面支撑乡村振兴战略。 2. 乡村振兴战略的政策背景 2022年中央一号文件…