鱼C论坛

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

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

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

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

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

x
本帖最后由 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('^[0-9A-Za-z]{17}[0-9A-Za-z]$')
                if not pattern.match(text):
                        self.ui.code.setText(text[:len(text)-1])
最佳答案
2023-8-25 14:42:07
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"^[0-9A-Za-z]{17}[0-9A-Za-z]?$"  # 修改正则表达式模式
        validator.setRegularExpression(pattern)

        self.ui.code.setValidator(validator)


if __name__ == "__main__":
    app = QApplication([])
    widget = MyWidget()
    widget.show()
    app.exec()
这段代码基于 PyQt6 进行了修改,并使用了QRegularExpressionValidator类来进行输入验证。修改后的代码在预定义的模式上设置了输入验证器,并将其应用于文本框上。

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

使用道具 举报

发表于 2023-8-25 14:21:52 | 显示全部楼层
问题的原因是在 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-9A-Za-z]{0,17}$')
        
        # 创建校验器,并设置正则表达式
        validator = QRegExpValidator(regex)
        
        # 将校验器应用到文本框中
        self.ui.code.setValidator(validator)

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

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

使用道具 举报

发表于 2023-8-25 14:22:08 | 显示全部楼层
根据你提供的代码,实现边输入边校验身份证号码格式的功能。以下是修改后的代码示例:
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-9A-Za-z]{0,17}[0-9A-Za-z]$")
        # 创建校验器,将正则表达式应用于文本框
        validator = QRegExpValidator(regex)
        self.ui.code.setValidator(validator)

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

    def validate_code(self, text):
        # 判断输入是否符合身份证格式
        pattern = re.compile('^[0-9A-Za-z]{17}[0-9A-Za-z]$')
        if not pattern.match(text):
            cursor = self.ui.code.cursorPosition()
            # 获取光标位置前的文本
            validated_text = text[:cursor-1] + text[cursor:]
            # 设置新的文本,并还原光标位置
            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)。

希望这能帮助你!如果你还有其他问题,请随时提问。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> 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 中实现实时输入校验的修改建议:
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"^[0-9A-Za-z]{17}[0-9A-Za-z]?$"  # 修改正则表达式模式
        validator.setRegularExpression(pattern)

        self.ui.code.setValidator(validator)


if __name__ == "__main__":
    app = QApplication([])
    widget = MyWidget()
    widget.show()
    app.exec()
这段代码基于 PyQt6 进行了修改,并使用了QRegularExpressionValidator类来进行输入验证。修改后的代码在预定义的模式上设置了输入验证器,并将其应用于文本框上。

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 22:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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