QSyntaxHighlighter - 文本选择覆盖样式

23

我正在使用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
你有没有找到更简单的解决方案? - Nicolas Holthaus
2
@NicolasHolthaus 我已经辞职了。如果我找到了更简单的方法(我不知道 QTextEdit::ExtraSelection 是否可行),我会分享的。 - LogicStuff
4
这是语法高亮器的一个非常恼人的限制。 - Nicolas Holthaus
1个回答

5
问题出在这里:

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

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

您可以创建一个继承自QPlainTextEdit的类并覆盖paintEvent。

签名:

void paintEvent(QPaintEvent *);

将github上函数的主体复制到新类paintEvent函数中:

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

在您的cpp文件中,在paintEvent之前添加此功能(PlainTextEdit需要它):

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

添加

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

并替换每个

出现的地方
o.format = range.format;

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

使用自定义的PlainTextEdit,检查与当前字符相关联的格式,而不是使用您的PlainTextEdit调色板。
(请注意(L)GPL许可证,我只提供一个开源的解决方案。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接