Если вы хотите дать специальный текст на основе текста, вам следует использовать 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_())