为了在QTextEdit中的单词周围绘制矩形,需要重写其paintEvent方法并使用QTextLayout类来确定单词的文本位置和范围。
以下是一个实现示例:
from PyQt5.QtWidgets import QTextEdit
from PyQt5.QtGui import QPainter, QTextLayout, QPen
class MyTextEdit(QTextEdit):
def paintEvent(self, event):
# 调用父类的paintEvent以保留QTextEdit的默认行为
super().paintEvent(event)
# 获取QTextEdit的文本内容
doc = self.document()
cursor = self.textCursor()
text = doc.toPlainText()
# 创建QPainter对象并设置画笔样式
painter = QPainter(self.viewport())
painter.setPen(QPen(Qt.red))
# 使用QTextLayout类来确定每个单词的位置和范围
layout = QTextLayout(text, painter.font())
pos = cursor.position() - 1
line = doc.findBlock(cursor.position()).text()
x = 0
y = 0
for word in line.split():
index = line.find(word, pos)
if index != -1:
pos = index + len(word)
layout.setText(line[index:pos])
layout.setPos(x, y)
rects = layout.glyphRuns()[0].glyphsBoundingRects()
for rect in rects:
painter.drawRect(rect.translated(x, y))
x += layout.glyphRuns()[0].advanceWidth(len(word)) + layout.font().pixelSize()
if x >= self.viewport().width():
x = 0
y += painter.fontMetrics().height()
painter.end()
此代码重写了QTextEdit的paintEvent方法,使用QTextLayout类来确定每个单词的文本位置和范围,并使用QPainter.drawRect方法在单词周围绘制红色矩形。