✨✨ 欢迎大家来到景天科技苑✨✨
🎈🎈 养成好习惯,先赞后看哦~🎈🎈
🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,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
控件可以灵活地限制用户的输入,确保数据的正确性和程序的健壮性。在实际开发中,应根据具体需求选择合适的校验方式,并合理设置校验规则或掩码格式。此外,还可以结合信号与槽机制,对用户的输入进行实时监控和处理,进一步提升用户体验和程序的交互性。