首页 > 编程问答 >如何在QTextEdit中实现类似于PyQt6中QLineEdit的.setMaxLength的.setMaxLength?

如何在QTextEdit中实现类似于PyQt6中QLineEdit的.setMaxLength的.setMaxLength?

时间:2024-07-29 13:35:53浏览次数:8  
标签:python pyqt pyqt6 qtextedit

我正在寻找一种方法来实现上述内容。我创建了一个自定义 QTextEdit,它在下面的 QLabel 中显示字符数和允许的字符数。当我创建此类的实例时,一切都按预期工作,除了我尝试重新创建的 .setMaxLength 函数。下面是我的自定义 QTextEdit 类

class CustomTextEdit(QWidget):
   def __init__(self, max_length=None, placeholder_text='', height=None, callback=None, *args, **kwargs):
       super().__init__(*args, **kwargs)

       self.max_length = max_length

       self.text_edit = QTextEdit(self)
       self.label = QLabel(self)

       if height:
           self.setFixedHeight(height)

       if placeholder_text:
           self.text_edit.setPlaceholderText(placeholder_text)
       if callback:
           self.text_edit.textChanged.connect(callback)

       self.text_edit.textChanged.connect(self.update_char_count)
       self.text_edit.setLineWrapMode(QTextEdit.LineWrapMode.WidgetWidth)
       self.text_edit.setWordWrapMode(QTextOption.WrapMode.WordWrap)

       layout = QVBoxLayout()
       layout.setContentsMargins(0, 0, 0, 0)
       layout.setSpacing(0)
       layout.addWidget(self.text_edit, 1)
       layout.addWidget(self.label, alignment=Qt.AlignmentFlag.AlignRight)
       self.setLayout(layout)

       self.update_char_count()

   def update_char_count(self):
       char_count = len(self.text_edit.toPlainText())
       self.label.setText(f'{char_count}/{self.max_length if self.max_length is not None else "∞"}')

   def keyPressEvent(self, event):
       if self.max_length is not None:
           # Allow special keys and deletion regardless of character count
           if event.key() in (Qt.Key.Key_Backspace, Qt.Key.Key_Delete, Qt.Key.Key_Left, Qt.Key.Key_Right,
                              Qt.Key.Key_Up, Qt.Key.Key_Down, Qt.Key.Key_Control, Qt.Key.Key_Shift, Qt.Key.Key_Alt):
               super().keyPressEvent(event)
               return

           # Check if current character count exceeds max_length
           current_text = self.text_edit.toPlainText()
           if len(current_text) >= self.max_length and event.text():
               return  # Ignore new character input if it exceeds max_length

       super().keyPressEvent(event)

你的 keyPressEvent 函数中已经实现了一个非常接近 setMaxLength 行为的方案。然而,可以通过以下两种主要方式进行改进:

1. 使用信号来限制文本长度

与其在每次按键时检查文本长度,不如连接到 QTextEdit.textChanged 信号,并在文本长度超过限制时截断文本。这将提供更可靠的解决方案,即使文本以编程方式或通过粘贴操作更改:

class CustomTextEdit(QWidget):
    def __init__(self, max_length=None, placeholder_text='', height=None, callback=None, *args, **kwargs):
        # ... 其他初始化代码 ...

        self.text_edit.textChanged.connect(self.limit_text_length)

    def limit_text_length(self):
        if self.max_length is not None:
            text = self.text_edit.toPlainText()
            if len(text) > self.max_length:
                self.text_edit.setPlainText(text[:self.max_length])
                # 可选:将光标移动到文本末尾
                cursor = self.text_edit.textCursor()
                cursor.movePosition(QTextCursor.End)
                self.text_edit.setTextCursor(cursor)
        self.update_char_count()

    # ... 其他方法 ... 

2. 使用 QPlainTextEdit 的 input mask

QLineEdit setMaxLength 方法在内部使用输入掩码来限制文本长度。虽然 QTextEdit 没有直接等效的方法,但你可以使用 QPlainTextEdit 并设置一个输入掩码来达到类似的效果:

from PyQt6.QtWidgets import QPlainTextEdit

class CustomTextEdit(QWidget):
    def __init__(self, max_length=None, placeholder_text='', height=None, callback=None, *args, **kwargs):
       # ... 其他初始化代码 ...

       self.text_edit = QPlainTextEdit(self)
       if max_length is not None:
           self.text_edit.setInputMask(f'X{max_length}') 

       # ... 其他初始化代码 ...

这种方法使用 X 字符作为占位符,最多允许 max_length 个字符。

选择哪种方法?

  • 如果你需要一个简单的解决方案并且不需要支持富文本格式,则 input mask 方法更简单直接。
  • 如果你需要支持富文本格式或者需要对文本长度限制进行更精细的控制,则 信号 方法更灵活。

希望这些改进对你有帮助!

标签:python,pyqt,pyqt6,qtextedit
From: 78805505

相关文章

  • 12个Python数据类型转换实战演练
    文末赠免费精品编程资料~~在Python编程中,数据类型转换是处理数据时必不可少的技能。掌握如何灵活地在不同类型之间转换,能让你的代码更加高效和灵活。下面,我们将通过一系列实战演练,学习并实践12种常见的Python数据类型转换。1.整数转字符串实战案例:将年龄转换为字符串......
  • Python全套教程,小白零基础入门必备!
    Python是一种语法简单、功能强大的编程语言,它注重的是如何高效解决问题。【教程领取方式在文末!!】正是这种简单实用的特性,让Python成为近年来最热门的编程语言之一。Python具有广泛的应用场景,包括:Web开发、数据分析、机器学习、网络爬虫、人工智能、量化交易等众多领......
  • BP神经网络及其Python和MATLAB实现预测
    BP神经网络及其Python和MATLAB实现预测引言BP神经网络(BackPropagationNeuralNetwork),即反向传播神经网络,是一种通过反向传播算法进行监督学习的多层前馈网络。这种网络能够通过不断地调整和改变神经元的连接权重,达到对特定任务的学习和优化。由于其高度的灵活性和适应性......
  • 为什么Python要对引用非容器类型的类型实现循环GC
    检查文档:支持循环垃圾收集Python对检测和收集涉及循环引用的垃圾的支持需要对象类型的支持,这些对象类型是其他对象的“容器”,这些对象也可能是容器不存储对其他对象的引用或仅存储对原子类型(例如数字或字符串)的引用的类型不需要为垃圾收集提供任何显......
  • 如何在 Visual Studio Code 中降级终端中的 python?
    我有一段代码需要运行,但它仅与tensorflow1.3、1.4和1.5兼容。我想我需要降级python才能运行它,但是终端有python3.10我尝试创建虚拟环境失败,但终端仍然说它正在使用python3.10,所以我仍然无法运行代码有什么我可以做的吗?是对的,创建虚拟环境是运行不同Python版本代......
  • python-小李帮老师改错(赛氪OJ)
    [题目描述]老师给小理发了一封电子邮件,任务如下。写一个程序,给你 n 个数,输出 X。X=num1p1​​+num2p2​​+⋯+numnpn​​。                 num1​,num2​,⋯⋯,numn​ 都是整数,p1​,p2​,⋯⋯pn​ 都是一位数。但是出现了一些玄学错误,......
  • 保护从 py2exe python 生成的二进制文件
    我的项目需要将我的python文件转换为py2exe。公平地说,我的py2exe正在工作。假设我的二进制文件名为“test.exe”。我知道我的test.exe包含我的python文件的所有pyc文件。我想要做的是,保护我的text.exe,这样我的源代码就不会被看到,换句话说,我不希望它被反编译回来,我该怎......
  • python 将数字前面的字符替换为数字后面的新字符
    我有一些字符串看起来像:*.rem.1.gz和*.rem.2.gz我想将其替换为*.1.trim.gz和*.2.trim.gz1号文件和2号文件相互配对,我想创建一个单独的字符串来同时包含这两个文件。importosallfiles=os.listdirpair=[x.replace("rem.(\d+)","(\d+).trim")forxinall......
  • 使用python打开UNC文件
    如何使用python通过路径打开网络计算机上的文件?我当前正在使用os.startfile但随后出现错误winerror2:无法打开文件。文件路径是正确的,我可以通过win+R打开该文件。感谢您提供的任何帮助。importwin32wnetimportosdefopen_unc_path(unc_path,usern......
  • Python环境:深入理解与构建实践
    Python环境:深入理解与构建实践在当今的软件开发领域中,Python以其简洁的语法、丰富的库支持和广泛的应用场景,成为了众多开发者、数据科学家、机器学习工程师及自动化测试人员的首选语言。然而,要高效地使用Python进行项目开发,深入理解并合理构建Python环境是至关重要的。本文......