Как использовать отступы, поля и т. д. в форматированном тексте Qt на уровне диапазона?

Для моего QTextEdit я хотел использовать что-то чрезвычайно простое, вложенное выделение, которое я сделал, возясь с W3Schools Try It!, который выглядит следующим образом.

Результат W3Schools

Насколько я могу судить, я использовал только вещи из поддерживаемого подмножества HTML в Qt (см. HTML в коде ниже, используются только отступы, поля и фоновый цвет).

Я не мог получить аналогичный рендер, похоже, работал только фоновый цвет.

Я сделал новый проект, чтобы сделать простой тест, используя жестко закодированный HTML/стиль, а не мою процедурную генерацию, и все же он не отображается должным образом.

Вот код.

import sys

from PySide6.QtWidgets import QApplication, QTextEdit, QMainWindow

app = QApplication(sys.argv)

test_window = QMainWindow()
test_text_edit = QTextEdit()

html = """
<!DOCTYPE html>
<html>
<head>
<style>
span.a {
  padding: 2px;
  margin: -2px;
  background-color: orange;
}
span.b {
  background-color: powderblue;
}
</style>
</head>
<body>
<div>volutpat. <span class="a">Aliquam <span class="b">venenatis</span> gravida</span> nisl</div>
</body>
</html>
"""
test_text_edit.setHtml(html)
test_window.setCentralWidget(test_text_edit)

test_window.show()

sys.exit(app.exec_())

Вот результат, которому не хватает резкого количества стилей, я сошел с ума или это не должно выглядеть в основном идентично в соответствии с документацией? Не хватает отступов, которые делают вложенность более четкой?

Мой результат QTextEdit

Кажется, проблема с маржей известна Стиль маржи не имеет эффект в текстовой метке qt Rich Text, но никто не ответил и на этот вопрос.

Кто-нибудь знает какие-либо исправления/обходные пути? Или где это задокументировано как известное ограничение Qt?

как я использую QTextEdit в pyqt5, чтобы показать весь стиль html (включая стиль css) также связан, но не является дубликатом, он просто указывает на документ того CSS, за которым он следует, он делает не объясняет, почему он не следует, или как следовать стандарту, которому, как он говорит, он следует.


person Shefeto    schedule 28.02.2021    source источник
comment
span по умолчанию является встроенным элементом и не реагирует на вертикальные отступы и высоту. Чтобы решить эту проблему, используйте span { display: inline-block; }. Другое дело, что вам нужно добавить поля, отступы и границы, чтобы рассчитать общий размер/длину элемента. Использование * { box-sizing: border-box; } сохранит границу и отступы внутри элемента. Поля всегда находятся за пределами элемента.   -  person bron    schedule 28.02.2021
comment
Я сомневаюсь, что это действительно выполнимо с Qt: если вы читаете определения свойств margin-*, они всегда ссылаются на поля абзаца. Единственной возможностью было бы создать подкласс QTextDocument и/или QTextEdit и вручную нарисовать фон, используя пользовательский формат, чтобы идентифицировать специальное выделение. Если вам нужна полная поддержка HTML/CSS, используйте QWebEngineView.   -  person musicamante    schedule 28.02.2021
comment
@bron К сожалению, мы говорим о пользовательской (и частичной) реализации таблиц стилей, которая поддерживает только подмножество HTML и CSS 2.1, поэтому ни одно из ваших предложений не сработает.   -  person musicamante    schedule 28.02.2021
comment
Примечание: помните, что то, что отображается в любом элементе управления на основе расширенного текста Qt, использует QTextDocument (даже QLabel, даже если он не является общедоступным), который предоставляет ограниченные возможности для размещения и рендеринга текста, поскольку он не предназначен для расширенных функций в качестве стандартный рендерер HTML. И это понятно: стандартные элементы управления пользовательского интерфейса должны предоставлять только базовые функции, чтобы поддерживать хорошую производительность; setHtml() не помещает этот HTML в текстовый элемент управления, а анализирует данное содержимое с помощью парсера Qt html и генерирует/изменяет базовый QTextDocument.   -  person musicamante    schedule 28.02.2021