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