Griffort
Griffort

Reputation: 1305

How to retain Syntax Highlighting during text highlight

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

For example:

example Visual Studio

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

Upvotes: 5

Views: 650

Answers (2)

Dave Hudson
Dave Hudson

Reputation: 31

I've just been working on this using PySide6 and looks like some things may have changed in Qt since the answer above. This is what's working for me (and thank you for the post above because it's the only one I've found that had anything like a simple answer!):

palette = self.palette()
palette.setBrush(QPalette.ColorRole.HighlightedText, QBrush(Qt.BrushStyle.NoBrush))
self.setPalette(palette)

Upvotes: 0

Griffort
Griffort

Reputation: 1305

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! ~

Upvotes: 7

Related Questions