【发布时间】:2021-05-12 17:31:02
【问题描述】:
我的 QTextEdit 的 paintEvent 中有这个简单的代码,它在当前选定的 QTextBlock 下绘制了一个灰色框:
def paintEvent(self, ev):
painter = QPainter()
painter.begin(self.viewport())
currentPos = self.textCursor().position()
block = self.document().findBlock(currentPos)
rect = self.document().documentLayout().blockBoundingRect(block)
margin = self.document().documentMargin()
rect.setTopLeft(QPoint(int(rect.topLeft().x()-margin), int(rect.topLeft().y()-margin)))
rect.setBottomRight(QPoint(int(rect.bottomRight().x()+margin), int(rect.bottomRight().y())))
painter.fillRect(rect, QBrush(QColor(10, 10, 10,20)))
if self._last_selected_block and (self._last_selected_block != block):
lastrect = self.document().documentLayout().blockBoundingRect(self._last_selected_block) #clean up artifacts
painter.eraseRect(lastrect)
painter.fillRect(self.contentsRect(), QBrush(QColor(123, 111, 145, 80))) #background color
painter.end()
self._last_selected_block = block
super().paintEvent(ev)
(注意,“清理工件”行会擦除在先前选择的 QTextBlock 区域中绘制的任何内容,因为如果在其中绘制文本,最后一个块下方会保留一条细灰线。可能是相关的。)
下一个矩形仅在光标移动到的字符周围部分绘制,前一个矩形没有被擦除。 eraseRect() 似乎无法删除此工件。当继续输入或换行时,一切都会恢复正常(通过换行换行时不会出现此问题)。我已经确认当光标移动时会调用paintEvent(),并且要绘制的矩形的宽度永远不会改变。这里发生了什么?
【问题讨论】:
标签: python pyqt pyqt5 qtextedit