首页 > 解决方案 > 如何更改空白字符的颜色?

问题描述

我正在使用 Qt 和 Python(PySide2) 制作文本编辑器。像大多数其他文本编辑器一样,我想制作可见的空格(空格、制表符、换行符...)并成功。QTextEdit 和 QTextOption 将空白字符显示为可见的特殊字符。(空格到点,制表符到箭头,换行到反向-P)

但这些特殊字符的颜色与其他字符相同。我认为如果颜色不同,它会更具可读性。

如何更改空格特殊字符的颜色?

orgText = """
\t\tAll those moments
\t\twill be lost
  in time
  like tears
in rain.
       It's time to die."""
option = QtGui.QTextOption()
option.setFlags(QtGui.QTextOption.ShowTabsAndSpaces | QtGui.QTextOption.ShowLineAndParagraphSeparators)
self.teOrg.setPlainText(orgText)
self.teOrg.document().setDefaultTextOption(option)

标签: pythonpyside2qtextedit

解决方案


最后,我重写了@eyllanesc 的代码。

import sys
import typing
import re

from PySide2 import QtCore
from PySide2 import QtGui
from PySide2 import QtWidgets


class SyntaxHighlighter(QtGui.QSyntaxHighlighter):
  def __init__(self, parent:typing.Union[QtCore.QObject, QtGui.QTextDocument, None]=None):
    super().__init__(parent)
    self.spaceFmt = QtGui.QTextCharFormat()
    self.spaceFmt.setForeground(QtGui.QColor('red'))
    self.expression = re.compile(r'\s+', re.U | re.S | re.M)


  def highlightBlock(self, text:str):
    for match in self.expression.finditer(text):
      start, end = match.span()
      self.setFormat(start, end - start, self.spaceFmt)


class TextEditWin(QtWidgets.QMainWindow):
  def __init__(self):
    # Initialize ui.
    super().__init__()
    self.resize(800, 600)
    self.textEdit = QtWidgets.QTextEdit(self)
    self.setCentralWidget(self.textEdit)
    self.textEdit.setFontPointSize(15)

    # Make space characters visible.
    option = QtGui.QTextOption()
    option.setFlags(QtGui.QTextOption.ShowTabsAndSpaces | QtGui.QTextOption.ShowLineAndParagraphSeparators)
    self.textEdit.document().setDefaultTextOption(option)

    # Change color of space characters.
    self.highlighter = SyntaxHighlighter(self.textEdit.document())


if __name__ == '__main__':
  app = QtWidgets.QApplication(sys.argv)
  win = TextEditWin()
  win.show()
  sys.exit(app.exec_())

我的代码也不会改变段落分隔符(¶)的颜色。我认为这是因为 Qt 在调用 highlightBlock() 时提供了除 '\n' 之外的文本。

谢谢@eyllanesc。


推荐阅读