Использование QT для создания редактора WYSIWYG для пользовательского языка разметки - PullRequest
2 голосов
/ 09 марта 2010

Я новичок в QT и пытаюсь найти лучшие способы создания виджета WYSIWYG-редактора для пользовательского языка разметки, который отображает простой текст, изображения и ссылки. Мне нужно иметь возможность распространять изменения из редактора WYSIWYG в пользовательское представление разметки.

В качестве конкретного примера проблемной области представьте, что в пользовательской разметке может быть тег «player», который содержит имя игрока и название команды. Разметка может выглядеть так: Last week, <player id="1234"><name>Aaron Rodgers</name><team>Packers</team></player> threw a pass. Этот текст будет отображаться в редакторе как:

На прошлой неделе Аарон Роджерс из Пакеров бросил пас.

Имя игрока и название команды могут редактироваться непосредственно в редакторе стандартным способом WYSIWYG, так что моим пользователям не нужно изучать какую-либо разметку. Кроме того, когда имя игрока наведено, появится всплывающее окно с информацией об этом игроке и аналогично команде.

С этим длинным вступлением я пытаюсь понять, с чего начать с QT. Кажется, что наиболее логичным вариантом будет Rich Text API, использующий QTextDocument. Этот подход кажется далеко не идеальным, учитывая ограничения QTextDocument:

  • Я не могу понять, как захватывать навигационные события, нажимая на ссылки.
  • Следующие ссылки при клике, по-видимому, включаются только тогда, когда QTextEdit доступен только для чтения.
  • Пользовательские объекты, которые реализуют QTextObjectInterface, игнорируются в операциях копирования и вставки
  • Любая основанная на HTML разметка, которая передается ему как Rich Text, ретранслируется в серию тегов span и множество других нежелательных элементов, что делает чрезвычайно трудным распространение изменений из редактора обратно в исходную пользовательскую разметку.

Второй вариант - QWebKit, который позволяет редактировать в реальном времени разметку HTML5, поэтому я могу указать двусторонний перевод между пользовательской разметкой и HTML5. Мне не ясно, как можно передавать изменения из редактора обратно в исходную разметку в режиме реального времени без повторного перевода всего документа при каждом изменении текста. Решения QWebKit для меня выглядят ужасно громоздкими (изучение WebKit вместе с QT), что должно быть относительно простой задачей.

Я также рассмотрел возможность реализации WYSIWYG с пользовательским классом, используя собственные контейнеры QT, метки, изображения и другие виджеты вручную. Это кажется наиболее гибким подходом, который, скорее всего, не столкнется с неразрешимыми проблемами. Однако я вполне уверен, что реализация всех деталей обычного текстового редактора (выбор текста, изменение шрифта, поддержка вырезания и вставки, отмена / повтор, перетаскивание объектов, размещение курсора и т. Д.) Будет невероятно трудоемкой .

Итак, наконец, мой вопрос: есть ли гуру QT с некоторыми советами о том, с чего начать этот проект?

Кстати, я использую QT, потому что это настольное приложение, которое требует независимости от платформы.

1 Ответ

0 голосов
/ 19 июня 2010

Учитывая, что здесь я не получил никакого совета, я решил использовать подход QTextEdit, хотя на самом деле я использую QTextBrowser, который настроен для редактирования, чтобы я мог захватывать события навигации по ссылкам. Я буду использовать QTextCharFormat с именами ссылок, установленными на уникальные идентификаторы, чтобы преобразовать из QTextEdit обратно в пользовательскую разметку. QTextEdit уже поддерживает изображения, поэтому мне не придется иметь с ними дело.

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

...