如何在文本突出显示期间保留语法突出显示

Posted

技术标签:

【中文标题】如何在文本突出显示期间保留语法突出显示【英文标题】:How to retain Syntax Highlighting during text highlight 【发布时间】:2018-02-13 00:07:44 【问题描述】:

在大多数代码编辑器中,文本突出显示不会删除语法颜色。

例如:

Visual Studio

崇高的文字

我想在我用 QT 制作的代码编辑器中模拟这个功能;但是,文本突出显示会将所有文本变成单一颜色:

是否可以在文本突出显示期间保留语法突出显示?


仅供参考:我使用QPlainTextEditQSyntaxHighlighter 来创建编辑器。我尝试更改QPlainTextEdit 的调色板,但我似乎找不到禁用HighlightedText 效果的方法。


编辑: 这是我用来添加一些上下文的代码的简化版本:

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

【问题讨论】:

显示更多代码,如何定义样式。我相信您可以在选择文本时定义不同样式的文本,而您只是错过了。 @MarekR 我只是在扩展的QSyntaxHighlighter::highlightBlock 中使用setFormat 函数。我在原始帖子中添加了一个小示例。我试图寻找一些东西来修改QTextCharFormat 以使突出显示颜色相同,但没有运气。 (另外,感谢您的帖子编辑。不知道您可以嵌入这样的图像>。 我检查了 Qt Creator 的工作原理。可悲的是,它有这个问题,所选文本没有着色。所以可能很难做你想做的事。 @MarekR Ack,我明白了。代码中是否有特定位置我应该查找文本重新着色的位置?也许我可以从那里弄清楚。 【参考方案1】:

好消息!重新审视这个问题后,我在玩了一会后找到了解决方案。感觉有点愚蠢,因为它工作得很好,所以不早点尝试。

QPlainTextEdit(或适用于该场景的任何小部件)上,您只需将QPalette::HighlightedText 设置为QBrush(Qt::NoBrush)


例如,要从 Sublime Text 复制透明高亮,您只需这样做:

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

结果:

【讨论】:

以上是关于如何在文本突出显示期间保留语法突出显示的主要内容,如果未能解决你的问题,请参考以下文章

即使保留语法突出显示,将代码从 Visual Studio Code 复制到 OneNote 也会丢失选项卡缩进

如何在swift中突出显示文本时触发事件

如何在 UIWebView 中突出显示文本时删除“定义”菜单

无法关闭 Vim 文本突出显示 [重复]

具有语法突出显示的文本框/富文本框? [C#] [关闭]

如何在 tkinter Text 小部件中突出显示文本