Пометка определенных частей QTextDocument - PullRequest
0 голосов
/ 12 июня 2019

Мне нужно отредактировать документ, который был помечен семантически.

Предположим, у меня есть HTML-документ, в котором некоторые или все абзацы (или интервал) помечены определенным именем класса, например: <p class="bio"><span class="name">John</span><span class="surname">Doe</span>is a <span class="job">carpenter</span> living in <span class="place">York</span>.</p><p class="story">He was working at his bench when...</p>

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

Дополнительные требования:

  • Каждый class должен иметь определенный графический рендеринг (это должно быть легко при использовании CSS).
  • Редактирование конкретного <span> должно сохранить class (т.е., если я отредактирую "Джон" -> "Джонатан", оно все равно должно иметь class="name").
  • Я должен иметь возможность применить class к определенным фрагментам текста (т. Е. Выделить текст, открыть контекстное меню и выбрать один из возможных class es).
  • Удалить пометки из выделения.
  • Сериализация отредактированного текста (т. Е. Просмотр отредактированного текста, распознавание class изменений и возможность создания любой разметки, которую я хочу).
  • Примечание class могут содержаться друг в друге (но не частично перекрываться); это означает, что некоторый фрагмент кода имеет два (или более) class es.

Может ли это быть достигнуто стандартными средствами?

Насколько я видел QTextDocument и связанные с ним классы (например, QTextFrame, QTextFormat и т. Д.) Ориентированы на визуальное представление (стиль шрифта, цвет и т. Д.), В то время как мне нужны некоторые «логические» теги, которые могут отражать или не отражать в визуальных изменениях. Я имею в виду: текст может быть написан одним шрифтом / цветом / фоном, но при наведении на него курсора я смогу перечислить все class активных в этом конкретном месте (если есть).

Я пишу код в PyQt5, если это актуально.

Единственный (довольно некрасивый!) Способ, который я, похоже, вижу, чтобы добиться этого, - это использовать QTextCharFormat свойство tooltip для хранения классов (классов) каждого QTextFragment. Есть ли лучший вариант?

1 Ответ

0 голосов
/ 14 июня 2019

Для тех, у кого возникла такая же проблема:

QTextCharFormat имеет свойство (называемое «Свойство»), которое можно использовать для хранения произвольных данных.

Вам необходимо:

  • определяет ваш набор кодов (больше QtGui.QTextFormat.UserProperty, чтобы избежать конфликта с существующими свойствами).
  • устанавливается с помощью: format.setProperty(mycode, myvalue)
  • , считывается с: value = format.property(mycode)

Другие виджеты имеют похожие (но НЕ идентичные!) Механизмы (например, QStandardItem имеет похожее свойство с именем data)

ВАЖНОЕ ПРИМЕЧАНИЕ: если вы используете PyQt, существуют серьезные ограничения вто, что вы можете хранить и безопасно извлекать (хранение QTextDocument в QStandardItem.setData(doc, mycode) будет не будет работать надежно, потому что будет сохраняться только ссылка, и если базовый объект python будет собирать мусор, у вас будет хорошийпадение (SIGSEGV).

...