Скрытие текста с помощью QSyntaxHighlighter - PullRequest
5 голосов
/ 25 января 2012

Проблема: Я хочу реализовать виджет редактирования текста для текста с дополнительными тегами.Мне бы хотелось, чтобы некоторые теги были невидимыми в некоторых случаях, чтобы они не отвлекали пользователя.

Среда: Я использую PyQt и предпочитаю использовать QPlainTextWidget иQSyntaxHighlighter.

Подход: С QSyntaxHighlighter я могу установить QTextCharFormat для строк, которые соответствуют моему требованию.QTextCharFormat дает мне все свойства шрифта, такие как размер, цвета и т. Д. , но: Я не нашел возможности скрыть текст или уменьшить его размер до нуля.

Я не хочу удалять или заменять теги, так как это приведет к гораздо большему количеству кода (копирование должно содержать теги, и без него я не смогу использовать QSyntaxHighlighter для форматирования оставшегося текста в соответствии с тегами).

Обновление: Пока я нашел некрасивый хак.Если для QTextFormat :: FontLetterSpacing установить небольшое значение, текст будет занимать все меньше и меньше места.В сочетании с прозрачным цветом текст выглядит как невидимый.

Проблема: В моем тесте это работало только для интервалов между буквами до 0,016%.Ниже интервал сбрасывается до 100%.

1 Ответ

3 голосов
/ 10 ноября 2016

Для этого вы можете использовать базовый QTextDocument. Он состоит из блоков, видимость которых можно включать и выключать с помощью setVisible. Используйте QTextCursor для вставки текста и новых блоков и переключения видимости. В качестве бонуса функция копирования в любом случае копирует содержимое невидимых блоков.

Примечания: см. Документацию из QTextCursor для получения дополнительной информации. В другой вопрос здесь сообщалось, что настройка видимости не работает на QTextEdits.

Пример:

from PyQt5 import QtWidgets, QtGui

app = QtWidgets.QApplication([])

w = QtWidgets.QPlainTextEdit()
w.show()

t = QtGui.QTextCursor(w.document())
t.insertText('plain text')
t.insertBlock()
t.insertText('tags, tags, tags')
t.block().setVisible(False)

print(w.document().toPlainText())

app.exec_()
...