Как изменить цвет пробельных символов? - PullRequest
1 голос
/ 04 июля 2019

Я делаю текстовый редактор, используя 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)

Ответы [ 2 ]

1 голос
/ 05 июля 2019

Наконец, я переписал код @ 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 доставляет текст, кроме '\ n', когда вызывается highlightBlock ().

Спасибо @ eyllanesc.

1 голос
/ 04 июля 2019

Если вы хотите дать специальный текст на основе текста, вам следует использовать QSyntaxHighlighter. Для этого вы должны получить начало и конец шаблона и изменить формат, используя setFormat().

Я могу изменить только формат пробела (" ") и табуляции ("\t"), но не разделители абзацев ():

import re
from PySide2 import QtCore, QtGui, QtWidgets


orgText = """
\t\tAll those moments
\t\twill be lost
  in time
  like tears
in rain.
       It's time to die."""


class Highlighter(QtGui.QSyntaxHighlighter):
    def __init__(self, parent=None):
        super(Highlighter, self).__init__(parent)

        space_format = QtGui.QTextCharFormat()
        space_format.setBackground(QtGui.QColor("salmon"))

        tab_format = QtGui.QTextCharFormat()
        tab_format.setBackground(QtGui.QColor("lightgray"))

        self.highlightingRules = [
            (r"( )\1*", space_format),
            (r"(\t)\1*", tab_format),
        ]

    def highlightBlock(self, text):
        for pattern, fmt in self.highlightingRules:
            expression = re.compile(pattern)
            m = expression.search(text)
            while m is not None:
                start, end = m.span()
                self.setFormat(start, end - start, fmt)
                m = expression.search(text, end + 1)


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.teOrg = QtWidgets.QTextEdit()
        self.setCentralWidget(self.teOrg)

        self.teOrg.setPlainText(orgText)

        option = QtGui.QTextOption()
        option.setFlags(
            QtGui.QTextOption.ShowTabsAndSpaces
            | QtGui.QTextOption.ShowLineAndParagraphSeparators
        )
        self.teOrg.document().setDefaultTextOption(option)
        self.highlighter = Highlighter(self.teOrg.document())


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.resize(320, 240)
    w.show()
    sys.exit(app.exec_())

enter image description here

...