QPainter цветной текст (окраска синтаксиса) - PullRequest
2 голосов
/ 27 мая 2009

У меня есть собственный виджет Qt, который я использовал для отображения разборки, и я хочу добавить в него синтаксическую раскраску.

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

Вопрос в том, каков наилучший подход к добавлению окраски синтаксиса? Я думал о нескольких:

  1. Я мог бы просто разделить раскраску на логические блоки, каждому из которых предшествует установка QPen на нужный цвет.
  2. У меня могут быть специальные escape-символы, которые представляют изменение в цветовой палитре и отображают по 1 символу за раз.
  3. Я мог бы сделать модификацию # 1 и создать список std::pair<QColor, QString>, затем я мог бы просто повторить список, задав цвет и нарисовать текст, когда я выталкиваю элементы из передней части списка.
  4. Что-то совсем другое?

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

РЕДАКТИРОВАТЬ: Я знаю QSyntaxHighlighter и QTextDocument. Основная проблема в том, что они обычно не очень хорошо подходят для моих целей. У меня есть несколько столбцов, которые все имеют разделители и могут скользить вперед и назад. Чтобы дать вам представление, вот ссылка на скриншот моего отладчика . Как вы можете видеть, это не совсем текстовый документ. На самом деле это ближе к списку или таблице. Но уже есть куча нестандартных рисунков, делающих обычный QTextDocument несколько непрактичным.

РЕДАКТИРОВАТЬ : Я ошибся, кажется, что QTextDocument может выполнить рендеринг непосредственно в QPainter. Похоже, что мне нужно!

EDIT : Неясно, как контролировать, где и как QTextDocument или QTextLayout будут рисовать на QPainter. Я пытался использовать их безрезультатно. Так что, если кто-то может привести элементарный пример, это было бы очень полезно.

РЕДАКТИРОВАТЬ : я в итоге смог получить то, что хотел, используя что-то вроде этого:

painter.setPen(default_color);
QTextDocument doc;
doc.setDefaultFont(font());
doc.setDocumentMargin(0);
doc.setPlainText(text);
highlighter_->setDocument(&doc);

painter.save();
painter.translate(x, y);
QAbstractTextDocumentLayout::PaintContext context;
context.palette.setColor(QPalette::Text, painter.pen().color());
doc.draw(&painter, context);
painter.restore();

Ответы [ 2 ]

5 голосов
/ 27 мая 2009

Qt предоставляет QSyntaxHighlighter, что, вероятно, именно то, что вы хотите. QSyntaxHighlighter использует QTextDocument, чтобы пометить каждый блок кода определенным состоянием, которое может быть связано с конкретной презентацией формат .

Документация по QSyntaxHighlighter предоставляет пример, демонстрирующий, как это может быть достигнуто, и делает некоторые приятные вещи:

  • Отделяет модель от презентации
  • Разделяет форматирование на различные повторно используемые классы (если реализовано как таковое)
  • Поддерживает шаблон проектирования State , если это полезно для вашего языка
0 голосов
/ 27 мая 2009

Я бы использовал либо QTextEdit , либо направлял бы его подчеркивающий движок QTextDocument .

...