Search code examples
c++qtqplaintextedit

How to retain Syntax Highlighting during text highlight


In most code editors, the text highlight does not remove the syntax colors.

For example:

  • Visual Studio

example Visual Studio

  • Sublime Text

example Sublime Text

I would like to simulate this function in the code editor I'm making in QT; however, the text highlight turns all of the text into a single color:

dsd vs dsad

Would it be possible to retain the syntax highlighting during a text highlight?


FYI: I'm using a QPlainTextEdit and QSyntaxHighlighter to create the editor. I've tried changing the palette of the QPlainTextEdit, but I cannot seem to find a way to disable the HighlightedText effect.


EDIT: Here is a simplified version of the code I'm using to add some context:

void MyHighlighter::highlightBlock(const QString& text) {
  // Sets characters 0 ~ 10 to be colored rgb(100, 200, 100)
  QTextCharFormat temp;
  temp.setForeground(QColor(100, 200, 100));
  setFormat(0, 10, temp);
}

Solution

  • Good news! After revisiting this issue, I found the solution after playing around for a bit. Feel a little stupid not trying this sooner as it works perfectly.

    On the QPlainTextEdit (or whichever widget applicable to the scenario), you simply need to set the QPalette::HighlightedText to QBrush(Qt::NoBrush).


    For example, to replicate the transparent highlight from Sublime Text, you would simply do:

    auto palette = textEditWidget->palette();
    
    // provide highlight color with low alpha
    palette.setBrush(QPalette::Highlight, QColor(255, 255, 255, 30));
    
    // set highlight text brush to "No Brush"
    palette.setBrush(QPalette::HighlightedText, QBrush(Qt::NoBrush));
    
    // apply to widget
    textEditWidget->setPalette(palette);
    

    Result:

    i did the thing. hurrah! ~