[Python] How to setup the QPlainText line-height in Python

Discussão em 'Python' iniciado por Stack, Dezembro 1, 2025.

  1. Stack

    Stack Membro Participativo

    I encountered a problem while using Pyton's QPlaintExt component: How do I set the line height of QPlainText? I've tried multiple approaches: Method 1: Using QTextDocument with HTML (Guaranteed to Work)

    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)

    # Use QTextEdit instead of QPlainTextEdit
    self.text_edit = QTextEdit() self.text_edit.setAcceptRichText(True)
    layout.addWidget(self.text_edit)

    # Set line height using HTML/CSS
    self.set_text_with_line_height()

    def set_text_with_line_height(self):
    """Set text with line height using HTML/CSS"""
    html_content = """
    <style>
    p {
    line-height: 2.0; /* Double spacing */
    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_())


    Method 2: Custom QPlainTextEdit with Painter (Advanced but Works)

    importsys
    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):
    # Create a custom painter
    painter = QPainter(self.viewport())

    #Get the document and block
    doc = self.document()
    block = doc.firstBlock()

    # Get font metrics
    font_metrics = QFontMetrics(self.font())
    line_spacing = font_metrics.lineSpacing() * self.line_height_factor

    #Calculate visible area
    content_offset_y = self.contentOffset().y()
    viewport_rect = self.viewport().rect()

    painter.setFont(self.font())
    painter.setPen(self.palette().text().color())

    # Iterate through blocks
    while block.isValid():
    layout = block.layout()
    if not layout:
    block = block.next()
    continue

    # Get block position
    position = doc.findBlock(block.position()).position()
    block_rect = self.blockBoundingGeometry(block).translated(self.contentOffset()).toRect()

    # Only draw visible blocks
    if block_rect.bottom() < viewport_rect.top():
    block = block.next()
    continue
    if block_rect.top() > viewport_rect.bottom():
    break

    # Draw text with custom line height
    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)

    # Use our custom QPlainTextEdit
    self.text_edit = CustomPlainTextEdit(line_height_factor=2.0) # Double spacing
    layout.addWidget(self.text_edit)

    # Set text
    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_())


    Method 3: Simple Workaround - Use QTextEdit in Plain Text Mode ... Code omitted...

    None of the methods work(from 1 to 3).

    Continue reading...

Compartilhe esta Página