Подтвердить что ты не робот

QSyntaxHighlighter - стиль выбора текста отменяет

Я создаю собственный редактор кода с QPlainTextEdit и QSyntaxHighlighter, и я столкнулся с сбоем. Я хотел бы сохранить подсветку синтаксиса даже в пределах выделения. Однако цвета выделения (цвета среды) переопределяют цвета текста, выделенные тегами QSyntaxHighlighter и html. Сохраняются другие атрибуты, такие как семейство шрифтов.


Пример:

Нет выбора:               Выбор:
 Unselected     Selected
                                          (я хотел бы, чтобы 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);

Есть ли более простое решение для этого?

4b9b3361

Ответ 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, я просто даю обходное решение с открытым исходным кодом)