QSyntaxHighlighter - стиль выбора текста отменяет
Я создаю собственный редактор кода с QPlainTextEdit
и QSyntaxHighlighter
, и я столкнулся с сбоем. Я хотел бы сохранить подсветку синтаксиса даже в пределах выделения. Однако цвета выделения (цвета среды) переопределяют цвета текста, выделенные тегами QSyntaxHighlighter
и html. Сохраняются другие атрибуты, такие как семейство шрифтов.
Пример:
Нет выбора: Выбор:
(я хотел бы, чтобы Hello
был зеленым, а World!
- черным)
Я также попытался установить таблицу стилей:
QPlainTextEdit {
selection-color: rgba(0, 0, 0, 0);
selection-background-color: lightblue;
}
Результат:
Цвет фона накладывает текст и хорошо, цвет текста с alpha = 0
не отображается. Я сделал это, чтобы исключить мысль о том, что синтаксический цвет сохраняется в selection-color
. Фактически он накладывается selection-background-color
.
Изменить: Нет, если я также установил selection-background-color
в rgba(0, 0, 0, 0)
, там нет выбора и нет текста в этом выборе. Все, что я вижу, это фон.
Подход к следующему фрагменту, который выделяет целую курсорную линию, кажется таким, каким он есть, но я бы в конечном итоге пересмотрел все механизмы выбора...
QList<QTextEdit::ExtraSelection> extraSelections;
QTextCursor cursor = textCursor();
QTextEdit::ExtraSelection selection;
selection.format.setBackground(lineHighlightColor_);
selection.format.setProperty(QTextFormat::FullWidthSelection, true);
selection.cursor = cursor;
selection.cursor.clearSelection();
extraSelections.append(selection);
setExtraSelections(extraSelections);
Есть ли более простое решение для этого?
Ответы
Ответ 1
проблема здесь:
https://github.com/qt/qtbase/blob/e03b64c5b1eeebfbbb94d67eb9a9c1d35eaba0bb/src/widgets/widgets/qplaintextedit.cpp#L1939-L1945
QPlainTextEdit использует контекстную палитру вместо текущего формата выбора.
Вы можете создать одно наследование класса из QPlainTextEdit и переопределить paintEvent
подпись:
void paintEvent(QPaintEvent *);
Скопируйте тело функции из github внутри новой функции paintEvent класса:
https://github.com/qt/qtbase/blob/e03b64c5b1eeebfbbb94d67eb9a9c1d35eaba0bb/src/widgets/widgets/qplaintextedit.cpp#L1883-L2013
добавить эту функцию в ваш файл cpp перед paintEvent (PlainTextEdit paintEvent нужно):
https://github.com/qt/qtbase/blob/e03b64c5b1eeebfbbb94d67eb9a9c1d35eaba0bb/src/widgets/widgets/qplaintextedit.cpp#L1861-L1876
добавить
#include <QPainter>
#include <QTextBlock>
#include <QScrollBar>
и замените каждое вхождение
o.format = range.format;
whith
o.format = range.cursor.blockCharFormat();
o.format.setBackground(QColor(your selection color with alpha));
с тем, что ваш пользовательский PlainTextEdit проверяет формат, связанный с текущим char, а не с палитрой PlainTextEdit
(Остерегайтесь (L) лицензии GPL, я просто даю обходное решение с открытым исходным кодом)