qt qt5 qss qplaintextedit

qt - QSyntaxHighlighter-la selección de texto anula el estilo



qt5 qss (1)

Estoy haciendo un editor de código personalizado con QPlainTextEdit y QSyntaxHighlighter y he encontrado un problema QSyntaxHighlighter . Me gustaría conservar el resaltado de sintaxis incluso dentro de una selección. Sin embargo, los colores de la selección (colores del entorno) anulan los colores del texto resaltado por QSyntaxHighlighter y las etiquetas html. Otros atributos como la familia de fuentes se conservan.

Ejemplo:

Sin selección: Selección:

(Quisiera que Hello sea ​​verde y World! sea ​​negro)

También he intentado configurar la hoja de estilo para:

QPlainTextEdit { selection-color: rgba(0, 0, 0, 0); selection-background-color: lightblue; }

Resultado:


El color de fondo superpone el texto y, así, el color del texto con alpha = 0 no es visible. Lo he hecho solo para descartar la idea de que el color de la sintaxis persiste en selection-color . De hecho, está superpuesta por selection-background-color .
Edición: No, si también configuro el selection-background-color a rgba(0, 0, 0, 0) , no hay selección y no hay texto en esa selección. Todo lo que veo es el fondo.

El enfoque del siguiente fragmento que hace que toda la línea del cursor esté resaltada parece ser el camino a seguir, pero básicamente terminaría reimplementando todos los mecanismos de selección ...

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);

¿Hay alguna solución más simple para esto?


El problema reside aquí:

https://github.com/qt/qtbase/blob/e03b64c5b1eeebfbbb94d67eb9a9c1d35eaba0bb/src/widgets/widgets/qplaintextedit.cpp#L1939-L1945

QPlainTextEdit usa la paleta de contexto en lugar del formato de selección actual.

Podría crear una herencia de clase de QPlainTextEdit y anular PaintEvent

firma:

void paintEvent(QPaintEvent *);

Copie el cuerpo de la función desde github dentro de la nueva función paintEvent de clase:

https://github.com/qt/qtbase/blob/e03b64c5b1eeebfbbb94d67eb9a9c1d35eaba0bb/src/widgets/widgets/qplaintextedit.cpp#L1883-L2013

agregue esta función en su archivo cpp antes de paintEvent (PlainTextEdit paintEvent lo necesita):

https://github.com/qt/qtbase/blob/e03b64c5b1eeebfbbb94d67eb9a9c1d35eaba0bb/src/widgets/widgets/qplaintextedit.cpp#L1861-L1876

añadir

#include <QPainter> #include <QTextBlock> #include <QScrollBar>

y reemplazar cada aparición de

o.format = range.format;

con

o.format = range.cursor.blockCharFormat(); o.format.setBackground(QColor(your selection color with alpha));

con eso, su PlainTextEdit personalizado verifica el formato vinculado al carácter actual en lugar de su paleta PlainTextEdit

(cuidado (L) licencia GPL, acabo de dar una solución de código abierto)