Как настроить высоту строки QPlainText в PythonPython

Программы на Python
Ответить
Anonymous
 Как настроить высоту строки QPlainText в Python

Сообщение Anonymous »

Я столкнулся с проблемой при использовании компонента Pyton QPlaintExt: как установить высоту строки QPlainText? Я пробовал несколько подходов:
Метод 1: использование QTextDocument с HTML (работает гарантированно)

Код: Выделить всё

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 = """

p {
line-height: 2.0; /* Double spacing */
margin: 0;
padding: 0;
}

Line 1 with double spacing
Line 2 with double spacing
Line 3 with double spacing
Line 4 with double spacing
"""

self.text_edit.setHtml(html_content)

if __name__ == '__main__':
app = QApplication(sys.argv)
editor= TextEditor()
editor.show()
sys.exit(app.exec_())
Метод 2: Пользовательский QPlainTextEdit с помощью Painter (продвинутый, но работает)

Код: Выделить всё

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_())
Метод 3: простой обходной путь — используйте QTextEdit в режиме обычного текста
... Код опущен...
Ни один из методов не работает (от 1 до 3).

Подробнее здесь: https://stackoverflow.com/questions/798 ... -in-python
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»