QSyntaxHighlighter - 文本选择覆盖样式

时间:2015-01-31 22:03:35

标签: qt qt5 qtstylesheets qplaintextedit

我正在使用QPlainTextEditQSyntaxHighlighter制作自定义代码编辑器,但我遇到了一个小问题。我想在选择中保留语法突出显示。但是,选项的颜色(环境颜色)会覆盖由QSyntaxHighlighter和html标记突出显示的文本的颜色。保留字体系列等其他属性。


示例:

无选择:选择:
 Unselected Selected
(我希望 Hello 为绿色,World!为黑色)


我也尝试将样式表设置为:

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

结果:

enter image description here
背景颜色覆盖文本,并且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);

有没有更简单的解决方案?

1 个答案:

答案 0 :(得分:2)

问题在于:

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

QPlainTextEdit使用上下文调色板而不是当前选择格式。

您可以从QPlainTextEdit创建一个类继承并覆盖paintEvent

签名:

void paintEvent(QPaintEvent *);

从新类paintEvent函数中的github复制函数体:

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

在paintEvent(PlainTextEdit paintEvent需要它)之前在cpp文件中添加此函数:

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许可证,我只是提供一个开源解决方案)