我正在使用QPlainTextEdit
和QSyntaxHighlighter
制作自定义代码编辑器,但我遇到了一个小问题。我想在选择中保留语法突出显示。但是,选项的颜色(环境颜色)会覆盖由QSyntaxHighlighter
和html标记突出显示的文本的颜色。保留字体系列等其他属性。
示例:
无选择:选择:
(我希望 Hello
为绿色,World!
为黑色)
我也尝试将样式表设置为:
QPlainTextEdit {
selection-color: rgba(0, 0, 0, 0);
selection-background-color: lightblue;
}
结果:
背景颜色覆盖文本,并且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);
有没有更简单的解决方案?
答案 0 :(得分:2)
问题在于:
QPlainTextEdit使用上下文调色板而不是当前选择格式。
您可以从QPlainTextEdit创建一个类继承并覆盖paintEvent
签名:
void paintEvent(QPaintEvent *);
从新类paintEvent函数中的github复制函数体:
在paintEvent(PlainTextEdit paintEvent需要它)之前在cpp文件中添加此函数:
添加
#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许可证,我只是提供一个开源解决方案)