I’m looking for a way to implement the above. I have created a custom QTextEdit, that display the character count and the allowed character count in a QLabel below. When I create an instance of this class, everything works as expected, except the .setMaxLength function I’ve tried to recreate. Below is my custom QTextEdit class
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)