2015-01-31 15 views
19

Sto creando un editor di codice personalizzato con QPlainTextEdit e QSyntaxHighlighter e ho riscontrato un problema tecnico. Mi piacerebbe mantenere l'evidenziazione della sintassi anche all'interno di una selezione. Tuttavia, i colori della selezione (colori dell'ambiente) sostituiscono i colori del testo evidenziato da QSyntaxHighlighter e i tag HTML. Altri attributi come la famiglia di caratteri vengono mantenuti.QSyntaxHighlighter - la selezione del testo ha la precedenza sullo stile


Esempio:

No selezione:                       Selezione:
Unselected         Selected
                                                                      (mi piacerebbe Hello essere verde e World! essere nero)


Ho anche cercato di impostare il foglio di stile a:

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

Risultato:

enter image description here
Il colore di sfondo si sovrappone al testo e al pozzetto, colore del testo con alpha = 0 non è visibile. L'ho fatto solo per escludere l'idea che il colore della sintassi persista sotto selection-color. È infatti sovrapposto a selection-background-color.
Edit: No, se anche ho impostato selection-background-color-rgba(0, 0, 0, 0), non c'è alcuna selezione e non c'è testo in quella selezione. Tutto quello che vedo è lo sfondo.


approccio del seguente frammento che rende la linea intera di cursore evidenziato sembra la strada da percorrere, ma mi sarebbe fondamentalmente finire reimplementare tutti i meccanici di selezione ...

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

C'è qualche semplice soluzione a questo?

+0

Hai mai trovare una soluzione più semplice? –

+1

@NicolasHolthaus Mi sono dimesso. Se avessi trovato un approccio più semplice (non so se 'QTextEdit :: ExtraSelection' sia una soluzione valida), l'avrei condiviso. – LogicStuff

+3

questa è una limitazione davvero fastidiosa dell'evidenziatore di sintassi. –

risposta

2

il problema risiede qui:

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

QPlainTextEdit tavolozza uso contesto, invece di formato di selezione corrente.

Si potrebbe creare uno inheritings classe da QPlainTextEdit e ignorare paintEvent

firma:

void paintEvent(QPaintEvent *); 

Copiare il corpo della funzione da github all'interno della nuova funzione di classe paintEvent:

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

aggiungi questa funzione nel tuo file cpp prima di paintEvent (PlainTextEdit paintEvent ne ha bisogno):

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

aggiungere

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

e sostituire ogni occorrenza di

o.format = range.format; 

whith

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

con quella vostra abitudine PlainTextEdit controllare ° formato e legato al carattere corrente al posto del tuo tavolozza PlainTextEdit

(attenzione (licenza L) GPL, ho solo dare una soluzione opensource)

Problemi correlati