You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 23:14:50