鱼C论坛

 找回密码
 立即注册
查看: 1103|回复: 6

[已解决]对QTextEdit控件实现边输入边校验

[复制链接]
发表于 2023-8-25 14:21:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 hynet1024 于 2023-8-25 14:22 编辑

我想对输入的身份证代码实现边输入边实时校验,控件self.ui.code第1-17位只能是数字,第18位可以是数字或字母。以下是我的代码,但未能满足我的需求,现在任何字符都不能输入,求助大神指点。

  1. class MyWidget(QWidget):
  2.         def __init__(self):
  3.                 super().__init__()
  4.                 self.ui = Ui_Form()
  5.                 self.ui.setupUi(self)
  6.                
  7.                 self.ui.code.textChanged.connect(self.validate_code)

  8.         def validate_code(self, text):
  9.                 pattern = re.compile('^[0-9A-Za-z]{17}[0-9A-Za-z]$')
  10.                 if not pattern.match(text):
  11.                         self.ui.code.setText(text[:len(text)-1])
复制代码
最佳答案
2023-8-25 14:42:07
hynet1024 发表于 2023-8-25 14:30
不好意思我是Qt6,请再予以指点,谢谢

以下是在 PyQt6 中实现实时输入校验的修改建议:

  1. from PyQt6.QtWidgets import QWidget, QApplication
  2. from PyQt6.QtGui import QRegularExpressionValidator
  3. from ui_form import Ui_Form

  4. class MyWidget(QWidget):
  5.     def __init__(self):
  6.         super().__init__()
  7.         self.ui = Ui_Form()
  8.         self.ui.setupUi(self)
  9.         
  10.         validator = QRegularExpressionValidator(self)
  11.         pattern = r"^[0-9A-Za-z]{17}[0-9A-Za-z]?$"  # 修改正则表达式模式
  12.         validator.setRegularExpression(pattern)

  13.         self.ui.code.setValidator(validator)


  14. if __name__ == "__main__":
  15.     app = QApplication([])
  16.     widget = MyWidget()
  17.     widget.show()
  18.     app.exec()
复制代码

这段代码基于 PyQt6 进行了修改,并使用了QRegularExpressionValidator类来进行输入验证。修改后的代码在预定义的模式上设置了输入验证器,并将其应用于文本框上。

希望这次可以满足你的需要。如果还有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-25 14:21:52 | 显示全部楼层
问题的原因是在 validate_code 方法中,当输入不符合要求时,直接将文本设置为之前的文本去掉最后一个字符,这样会导致输入的字符无法显示在文本框中。

为了实现边输入边校验的功能,可以使用 QRegExpValidator 来对输入进行校验。以下是修改后的代码:

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

  3. class MyWidget(QWidget):
  4.     def __init__(self):
  5.         super().__init__()
  6.         self.ui = Ui_Form()
  7.         self.ui.setupUi(self)
  8.         
  9.         # 创建正则表达式,限制输入为1-17位数字,第18位可以是数字或字母
  10.         regex = QRegExp('^[0-9A-Za-z]{0,17}$')
  11.         
  12.         # 创建校验器,并设置正则表达式
  13.         validator = QRegExpValidator(regex)
  14.         
  15.         # 将校验器应用到文本框中
  16.         self.ui.code.setValidator(validator)
复制代码


在修改后的代码中,我们使用了 QRegExp 来创建了一个正则表达式,限制输入为1-17位数字,第18位可以是数字或字母。然后,我们创建了一个 QRegExpValidator 校验器,并将正则表达式应用到文本框中。

这样,当用户输入不符合要求的字符时,文本框将不会接受这些字符,并且不会影响之前输入的内容。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-25 14:22:08 | 显示全部楼层
根据你提供的代码,实现边输入边校验身份证号码格式的功能。以下是修改后的代码示例:

  1. from PyQt5.QtWidgets import QWidget
  2. from PyQt5.QtCore import QRegExp
  3. from PyQt5.QtGui import QRegExpValidator
  4. from ui_form import Ui_Form

  5. class MyWidget(QWidget):
  6.     def __init__(self):
  7.         super().__init__()
  8.         self.ui = Ui_Form()
  9.         self.ui.setupUi(self)

  10.         # 创建正则表达式对象,限制输入为数字和字母
  11.         regex = QRegExp("^[0-9A-Za-z]{0,17}[0-9A-Za-z]$")
  12.         # 创建校验器,将正则表达式应用于文本框
  13.         validator = QRegExpValidator(regex)
  14.         self.ui.code.setValidator(validator)

  15.         # 连接文本变更事件到校验函数
  16.         self.ui.code.textChanged.connect(self.validate_code)

  17.     def validate_code(self, text):
  18.         # 判断输入是否符合身份证格式
  19.         pattern = re.compile('^[0-9A-Za-z]{17}[0-9A-Za-z]$')
  20.         if not pattern.match(text):
  21.             cursor = self.ui.code.cursorPosition()
  22.             # 获取光标位置前的文本
  23.             validated_text = text[:cursor-1] + text[cursor:]
  24.             # 设置新的文本,并还原光标位置
  25.             self.ui.code.setText(validated_text)
  26.             self.ui.code.setCursorPosition(cursor-1)
复制代码


在这个示例中:

1. 我们使用了QRegExp来定义一个正则表达式规则,限制输入为数字和字母。这样可以在文本框中只允许输入合法的字符。
2. 创建了一个QRegExpValidator对象,并将正则表达式规则应用于文本框上,以实现输入校验。
3. 将textChanged信号连接到校验函数validate_code上。
4. 在校验函数中,我们使用正则表达式判断输入文本是否符合身份证号码的格式。如果不符合,我们获取当前光标位置,从输入文本中剔除非法字符并还原光标位置。

请注意,上述代码是基于PyQt5库编写的,前提是你已经安装了这个库。另外,你可能需要相应的界面文件(如ui_form.py)以及与之关联的UI设计软件(如Qt Designer)。

希望这能帮助你!如果你还有其他问题,请随时提问。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-8-25 14:23:40 | 显示全部楼层
陶远航 发表于 2023-8-25 14:22
根据你提供的代码,实现边输入边校验身份证号码格式的功能。以下是修改后的代码示例:

界面和控件都已完成,忘了我是Qt6,请再指点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-25 14:30:50 | 显示全部楼层
isdkz 发表于 2023-8-25 14:21
问题的原因是在 validate_code 方法中,当输入不符合要求时,直接将文本设置为之前的文本去掉最后一个字符 ...

不好意思我是Qt6,请再予以指点,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2023-8-25 14:40:50 | 显示全部楼层
不好意思我用的是PyQt6,与Qt5存在较大区别
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-25 14:42:07 | 显示全部楼层    本楼为最佳答案   
hynet1024 发表于 2023-8-25 14:30
不好意思我是Qt6,请再予以指点,谢谢

以下是在 PyQt6 中实现实时输入校验的修改建议:

  1. from PyQt6.QtWidgets import QWidget, QApplication
  2. from PyQt6.QtGui import QRegularExpressionValidator
  3. from ui_form import Ui_Form

  4. class MyWidget(QWidget):
  5.     def __init__(self):
  6.         super().__init__()
  7.         self.ui = Ui_Form()
  8.         self.ui.setupUi(self)
  9.         
  10.         validator = QRegularExpressionValidator(self)
  11.         pattern = r"^[0-9A-Za-z]{17}[0-9A-Za-z]?$"  # 修改正则表达式模式
  12.         validator.setRegularExpression(pattern)

  13.         self.ui.code.setValidator(validator)


  14. if __name__ == "__main__":
  15.     app = QApplication([])
  16.     widget = MyWidget()
  17.     widget.show()
  18.     app.exec()
复制代码

这段代码基于 PyQt6 进行了修改,并使用了QRegularExpressionValidator类来进行输入验证。修改后的代码在预定义的模式上设置了输入验证器,并将其应用于文本框上。

希望这次可以满足你的需要。如果还有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-20 15:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表