目录
简述
要实现自己所需要的相关高亮显示(例如,关键字高亮,搜索背景色,注释,等等其他),可继承QSyntaxHighlighter,并且实现highlightBlock(self, text)函数,将待定文档对象传入即可。本文仅仅作为,简单的展示关键字高亮,及背景色设置的笔记而已,代码可能会有冗余等等。
自定义的QSyntaxHighlighter
KEY_WORD = '(\\bdef\\b|\\bclass\\b)' # 待定关键字高亮显示
class MyHigh(QSyntaxHighlighter): # 继承 QSyntaxHighlighter
def __init__(self, parent=None, condition=None):
super().__init__(parent)
self.condition = condition # 传入的搜索条件
def highlightBlock(self, text):
fmt1 = QTextCharFormat() # 文本格式
fmt1.setBackground(Qt.GlobalColor.yellow) # 背景色
fmt2 = QTextCharFormat()
fmt2.setForeground(Qt.GlobalColor.blue) # 前景色
exp1 = QRegularExpression(self.condition) # 搜索条件一
exp2 = QRegularExpression(KEY_WORD) # 搜索条件二
match2 = exp2.globalMatch(text) # 全局匹配搜索
while match2.hasNext(): # 是否搜索到,没有就退出
obj = match2.next() # 下一个, 有就继续
self.setFormat(obj.capturedStart(), obj.capturedLength(), fmt2) # 自动填充格式
# 条件二要在条件一之前,否则被覆盖
match1 = exp1.globalMatch(text)
while match1.hasNext():
obj = match1.next()
self.setFormat(obj.capturedStart(), obj.capturedLength(), fmt1)
主窗体
# 工具常量
WIN_WIDTH = 600
WIN_HEIGHT = 400
# 工具函数
def move_center(widget, width, height): # 窗口居中
w = QGuiApplication.primaryScreen().size().width()
h = QGuiApplication.primaryScreen().size().height()
widget.setGeometry((w - width) / 2, (h - height) / 2, width, height)
# 主窗体
class MyWin(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('学习笔记')
move_center(self, WIN_WIDTH, WIN_HEIGHT) # 居中
layout = QVBoxLayout()
line = QLineEdit()
self.t = QTextEdit()
self.get_font(self.t) # 字体设置
MyHigh(self.t.document()) # 将文档对象传入自定义的QSyntaxHighlighter
layout.addWidget(line)
layout.addWidget(self.t)
self.setLayout(layout)
line.textChanged.connect(self.do_search) # 文本改变操作
def do_search(self, txt):
MyHigh(self.t, txt) # textChanged带有文本参数,直接传入自定义condition
def get_font(self, txt: QTextEdit) -> None: # 辅助函数,简单处理字体
font = QFont()
font.setFamily('consolas') # 字形
font.setPointSize(30) # 大小
font.setItalic(True) # 斜体
font.setBold(True) # 粗体
txt.setFont(font)
运行结果
注意
没有处理大小写,只需要对搜索关键字和条件,进行upper()或是lower()即可。