对QTextEdit控件实现边输入边校验
本帖最后由 hynet1024 于 2023-8-25 14:22 编辑我想对输入的身份证代码实现边输入边实时校验,控件self.ui.code第1-17位只能是数字,第18位可以是数字或字母。以下是我的代码,但未能满足我的需求,现在任何字符都不能输入,求助大神指点。
class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.ui = Ui_Form()
self.ui.setupUi(self)
self.ui.code.textChanged.connect(self.validate_code)
def validate_code(self, text):
pattern = re.compile('^{17}$')
if not pattern.match(text):
self.ui.code.setText(text[:len(text)-1]) 问题的原因是在 validate_code 方法中,当输入不符合要求时,直接将文本设置为之前的文本去掉最后一个字符,这样会导致输入的字符无法显示在文本框中。
为了实现边输入边校验的功能,可以使用 QRegExpValidator 来对输入进行校验。以下是修改后的代码:
from PyQt5.QtCore import QRegExp
from PyQt5.QtGui import QRegExpValidator
class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.ui = Ui_Form()
self.ui.setupUi(self)
# 创建正则表达式,限制输入为1-17位数字,第18位可以是数字或字母
regex = QRegExp('^{0,17}$')
# 创建校验器,并设置正则表达式
validator = QRegExpValidator(regex)
# 将校验器应用到文本框中
self.ui.code.setValidator(validator)
在修改后的代码中,我们使用了 QRegExp 来创建了一个正则表达式,限制输入为1-17位数字,第18位可以是数字或字母。然后,我们创建了一个 QRegExpValidator 校验器,并将正则表达式应用到文本框中。
这样,当用户输入不符合要求的字符时,文本框将不会接受这些字符,并且不会影响之前输入的内容。 根据你提供的代码,实现边输入边校验身份证号码格式的功能。以下是修改后的代码示例:
from PyQt5.QtWidgets import QWidget
from PyQt5.QtCore import QRegExp
from PyQt5.QtGui import QRegExpValidator
from ui_form import Ui_Form
class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.ui = Ui_Form()
self.ui.setupUi(self)
# 创建正则表达式对象,限制输入为数字和字母
regex = QRegExp("^{0,17}$")
# 创建校验器,将正则表达式应用于文本框
validator = QRegExpValidator(regex)
self.ui.code.setValidator(validator)
# 连接文本变更事件到校验函数
self.ui.code.textChanged.connect(self.validate_code)
def validate_code(self, text):
# 判断输入是否符合身份证格式
pattern = re.compile('^{17}$')
if not pattern.match(text):
cursor = self.ui.code.cursorPosition()
# 获取光标位置前的文本
validated_text = text[:cursor-1] + text
# 设置新的文本,并还原光标位置
self.ui.code.setText(validated_text)
self.ui.code.setCursorPosition(cursor-1)
在这个示例中:
1. 我们使用了QRegExp来定义一个正则表达式规则,限制输入为数字和字母。这样可以在文本框中只允许输入合法的字符。
2. 创建了一个QRegExpValidator对象,并将正则表达式规则应用于文本框上,以实现输入校验。
3. 将textChanged信号连接到校验函数validate_code上。
4. 在校验函数中,我们使用正则表达式判断输入文本是否符合身份证号码的格式。如果不符合,我们获取当前光标位置,从输入文本中剔除非法字符并还原光标位置。
请注意,上述代码是基于PyQt5库编写的,前提是你已经安装了这个库。另外,你可能需要相应的界面文件(如ui_form.py)以及与之关联的UI设计软件(如Qt Designer)。
希望这能帮助你!如果你还有其他问题,请随时提问。
如果问题已经解决,请设置最佳答案 陶远航 发表于 2023-8-25 14:22
根据你提供的代码,实现边输入边校验身份证号码格式的功能。以下是修改后的代码示例:
界面和控件都已完成,忘了我是Qt6,请再指点 isdkz 发表于 2023-8-25 14:21
问题的原因是在 validate_code 方法中,当输入不符合要求时,直接将文本设置为之前的文本去掉最后一个字符 ...
不好意思我是Qt6,请再予以指点,谢谢 不好意思我用的是PyQt6,与Qt5存在较大区别 hynet1024 发表于 2023-8-25 14:30
不好意思我是Qt6,请再予以指点,谢谢
以下是在 PyQt6 中实现实时输入校验的修改建议:
from PyQt6.QtWidgets import QWidget, QApplication
from PyQt6.QtGui import QRegularExpressionValidator
from ui_form import Ui_Form
class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.ui = Ui_Form()
self.ui.setupUi(self)
validator = QRegularExpressionValidator(self)
pattern = r"^{17}?$"# 修改正则表达式模式
validator.setRegularExpression(pattern)
self.ui.code.setValidator(validator)
if __name__ == "__main__":
app = QApplication([])
widget = MyWidget()
widget.show()
app.exec()
这段代码基于 PyQt6 进行了修改,并使用了QRegularExpressionValidator类来进行输入验证。修改后的代码在预定义的模式上设置了输入验证器,并将其应用于文本框上。
希望这次可以满足你的需要。如果还有其他问题,请随时提问。
页:
[1]