【发布时间】:2021-03-17 15:38:49
【问题描述】:
我有一个自定义文本框,它显示文本框右上角的字符数。 我通过继承 QTextEdit 并覆盖绘制事件并使用 QPainter 绘制字符数来做到这一点。
问题在于,当滚动绘画时,会出现扭曲并显示多个字符数。使用滚动条而不是鼠标滚轮滚动时可以更清楚地看到问题。
这是我的代码。
from PyQt5 import QtWidgets, QtCore, QtGui
import sys
class TextBox(QtWidgets.QTextEdit):
def __init__(self, maxChar=1000, *args, **kwargs):
super(TextBox, self).__init__(*args, **kwargs)
self.charCount = 0
self.maxChar = maxChar
self.painter_font = self.font()
self.painter_font.setFamily('')
self.painter_font.setPointSize(5)
self.textChanged.connect(self.changeCount)
def changeCount(self):
self.charCount = len(self.toPlainText())
def keyPressEvent(self, event):
if self.charCount < self.maxChar:
super(TextBox, self).keyPressEvent(event)
if self.charCount >= self.maxChar:
if event.key() in [QtCore.Qt.Key_Backspace, QtCore.Qt.Key_Delete, QtCore.Qt.Key_Up,
QtCore.Qt.Key_Left, QtCore.Qt.Key_Right, QtCore.Qt.Key_Down]:
super(TextBox, self).keyPressEvent(event)
if event.key() & QtCore.Qt.Key_A and event.modifiers() & QtCore.Qt.ControlModifier:
super(TextBox, self).keyPressEvent(event)
def paintEvent(self, event):
super(TextBox, self).paintEvent(event)
painter = QtGui.QPainter(self.viewport())
painter.setFont(self.painter_font)
painter.setPen(QtGui.QColor(QtCore.Qt.red))
count = f'{self.charCount}/{self.maxChar}'
multiplier = 4
if self.verticalScrollBar().isVisible():
multiplier = 8
painter.drawText(QtCore.QPoint(self.width() - (len(count) * multiplier + 30), self.height() - 10), count) # This is to make sure that the count stays inside the textbox when the number increases. If you have a better way pls help.
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
win = TextBox()
win.show()
sys.exit(app.exec_())
问题图片:
【问题讨论】:
-
您可以尝试使用标签来显示计数并在发生调整大小事件或其中一个滚动条变得可见时调整其位置。
-
TextEdit 内的@Heike 标签?
-
是的,让标签成为 TextEdit 的子标签并覆盖 TextEdit 的 resizeEvent。