Python中QPlainTextEdit行高设置无效,求助解决办法
QPlainTextEdit行高设置失效问题及三种尝试方案
我在使用Python的QPlainTextEdit组件时遇到行高设置问题,尝试以下三种方案均无效:
方案1:使用QTextDocument结合HTML的方法(原标注为可行方案)
该方案尝试用QTextEdit替代QPlainTextEdit,通过HTML/CSS样式设置行高,但实际无效。
import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QTextEdit, QVBoxLayout, QWidget from PyQt5.QtCore import Qt class TextEditor(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setWindowTitle('Working Line Height - HTML Method') self.setGeometry(100, 100, 600, 400) central_widget = QWidget() self.setCentralWidget(central_widget) layout = QVBoxLayout(central_widget) # 使用QTextEdit替代QPlainTextEdit self.text_edit = QTextEdit() self.text_edit.setAcceptRichText(True) layout.addWidget(self.text_edit) # 通过HTML/CSS设置行高 self.set_text_with_line_height() def set_text_with_line_height(self): """通过HTML/CSS设置带行高的文本""" html_content = """ <style> p { line-height: 2.0; /* 双倍行间距 */ margin: 0; padding: 0; } </style> <p>Line 1 with double spacing</p> <p>Line 2 with double spacing</p> <p>Line 3 with double spacing</p> <p>Line 4 with double spacing</p> """ self.text_edit.setHtml(html_content) if __name__ == '__main__': app = QApplication(sys.argv) editor = TextEditor() editor.show() sys.exit(app.exec_())
方案2:自定义带Painter的QPlainTextEdit(进阶可行方案)
该方案通过重写QPlainTextEdit的paintEvent方法,自定义文本绘制逻辑设置行高,但实际无效。
import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QPlainTextEdit, QVBoxLayout, QWidget from PyQt5.QtGui import QTextFormat, QPainter, QFontMetrics from PyQt5.QtCore import Qt, QRect class CustomPlainTextEdit(QPlainTextEdit): def __init__(self, line_height_factor=1.5): super().__init__() self.line_height_factor = line_height_factor def paintEvent(self, event): # 创建自定义绘制器 painter = QPainter(self.viewport()) # 获取文档和文本块 doc = self.document() block = doc.firstBlock() # 获取字体度量信息 font_metrics = QFontMetrics(self.font()) line_spacing = font_metrics.lineSpacing() * self.line_height_factor # 计算可见区域 content_offset_y = self.contentOffset().y() viewport_rect = self.viewport().rect() painter.setFont(self.font()) painter.setPen(self.palette().text().color()) # 遍历所有文本块 while block.isValid(): layout = block.layout() if not layout: block = block.next() continue # 获取文本块位置 block_rect = self.blockBoundingGeometry(block).translated(self.contentOffset()).toRect() # 只绘制可见的文本块 if block_rect.bottom() < viewport_rect.top(): block = block.next() continue if block_rect.top() > viewport_rect.bottom(): break # 按自定义行高绘制文本 lines = block.text().split('\n') y = block_rect.top() for line in lines: if y > viewport_rect.bottom(): break if y + line_spacing >= viewport_rect.top(): painter.drawText(QRect(0, y, viewport_rect.width(), line_spacing), Qt.AlignLeft | Qt.AlignTop, line) y += line_spacing block = block.next() painter.end() class TextEditor(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setWindowTitle('Custom QPlainTextEdit with Line Height') self.setGeometry(100, 100, 600, 400) central_widget = QWidget() self.setCentralWidget(central_widget) layout = QVBoxLayout(central_widget) # 使用自定义的QPlainTextEdit self.text_edit = CustomPlainTextEdit(line_height_factor=2.0) # 双倍行间距 layout.addWidget(self.text_edit) # 设置文本 self.text_edit.setPlainText("Line 1\nLine 2\nLine 3\nLine 4\nLine 5") if __name__ == '__main__': app = QApplication(sys.argv) editor = TextEditor() editor.show() sys.exit(app.exec_())
方案3:使用纯文本模式的QTextEdit作为替代(代码省略)
尝试将QTextEdit设置为纯文本模式,替代QPlainTextEdit来设置行高,同样无效。
内容的提问来源于stack exchange,提问作者Admin
相关产品推荐
相关产品推荐

