У меня есть собственный виджет Qt, который я использовал для отображения разборки, и я хочу добавить в него синтаксическую раскраску.
В настоящее время я просто устанавливаю QPen
в сплошной цвет, создаю текст, который хочу отобразить, и отображаю его в QPainter
в соответствующих координатах.
Вопрос в том, каков наилучший подход к добавлению окраски синтаксиса? Я думал о нескольких:
- Я мог бы просто разделить раскраску на логические блоки, каждому из которых предшествует установка QPen на нужный цвет.
- У меня могут быть специальные escape-символы, которые представляют изменение в цветовой палитре и отображают по 1 символу за раз.
- Я мог бы сделать модификацию # 1 и создать список
std::pair<QColor, QString>
, затем я мог бы просто повторить список, задав цвет и нарисовать текст, когда я выталкиваю элементы из передней части списка.
- Что-то совсем другое?
Я знаю, что каждый из 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();