QT/PyQT/PySide 通过富文本形式实现关键词高亮

2023-11-16

因为本质上都是QT,所以我标题带了QT,这个思路是没问题的,就是用C++得换个语言。

最开始想根据之前一篇博客的思路进行高亮

PyQT/PySide 文本浏览器跳转到指定行,并高亮指定行_qt 指定行高亮_Toblerone_Wind的博客-CSDN博客icon-default.png?t=N4P3https://blog.csdn.net/qq_42276781/article/details/127093403突然想到,QT中的文本浏览器可以设置成HTML的富文本格式,可以解析HTML语法,从而实现关键词高亮。例如,在HTML中,如果想让一个词apple变成红色,只需将原文本由apple替换为

<font color="red">apple</font>

<div style="color:red">apple</div>

这里在文本格式化类中实现了一个高亮函数,来高亮指定的关键词

import html
import re

class TextFormatter():
    __replacement = r'<font color="red">\1</font>' # 替换后保留原单词的大小写
    __keywords = ['TODO','FIXME','HACK','XXX','WORKAROUND']

    def highlight_keywords(self, text:str) -> str:
        # 转义特定字符,防止HTML误解析
        text = html.escape(text) 
        for keyword in self.__keywords:
            # 匹配时不考虑大小写,如需考虑移除re.IGNORECASE即可
            pattern = re.compile(f'({re.escape(keyword)})', re.IGNORECASE) 
            text = pattern.sub(self.__replacement, text)
        return text.strip()

highlight_keywords 函数内部,我们首先使用 html.escape 对文本进行转义,以确保字符的兼容性。然后,针对每个关键词,我们使用正则表达式进行替换操作,将匹配到的关键词用 <font color="red">关键词</font> 标签包裹起来以实现高亮效果。

使用正则表达式模式 re.compile(f'({re.escape(keyword)})', re.IGNORECASE) 来匹配指定单词,并且在替换时通过\1 保留原单词的大小写。

re.escape(keyword) 用于转义特殊字符,re.IGNORECASE 参数用于忽略大小写。然后,使用 pattern.sub(self.__replacement, text) 进行替换操作,将匹配到的关键词替换为 <font color="red">关键词</font> 。

完整代码

from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
from sys import argv
import html
import re

class TextFormatter():
    __replacement = r'<font color="red">\1</font>' # 替换后保留原单词的大小写
    __keywords = ['TODO','FIXME','HACK','XXX','WORKAROUND']

    def highlight_keywords(self, text:str) -> str:
        # 转义特定字符,防止HTML误解析
        text = html.escape(text) 
        for keyword in self.__keywords:
            # 匹配时不考虑大小写,如需考虑移除re.IGNORECASE即可
            pattern = re.compile(f'({re.escape(keyword)})', re.IGNORECASE) 
            text = pattern.sub(self.__replacement, text)
        return text.strip()


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        if not MainWindow.objectName():
            MainWindow.setObjectName(u"MainWindow")
        MainWindow.resize(300, 250)
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName(u"centralwidget")
        self.formLayout = QFormLayout(self.centralwidget)
        self.formLayout.setObjectName(u"formLayout")
        self.textBrowser = QTextBrowser(self.centralwidget)
        self.textBrowser.setObjectName(u"textBrowser")
        self.textBrowser.setLineWrapMode(QTextEdit.NoWrap)
        self.textBrowser.setReadOnly(False)
        font = QFont()
        font.setFamily(u"Arial")
        font.setPointSize(22)
        self.textBrowser.setFont(font)
        self.textBrowser.setHtml(u"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:'Consolas'; font-size:20pt; font-weight:400; font-style:normal;\">\n"
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><br /></p></body></html>")
        self.formLayout.setWidget(0, QFormLayout.SpanningRole, self.textBrowser)
        MainWindow.setCentralWidget(self.centralwidget)
        self.retranslateUi(MainWindow)
        QMetaObject.connectSlotsByName(MainWindow)
    # setupUi
 
    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))

        text = 'TODO is a food todo'                        # 文本
        text = TextFormatter().highlight_keywords(text)     # 高亮关键词
        self.textBrowser.setText(text)                      # 导入textBrowser
    # retranslateUi
 
 
if __name__ == "__main__":
    app = QApplication(argv)   # 创建应用程序
    mainWindow = QMainWindow() # 创建窗口
    ui = Ui_MainWindow()
    ui.setupUi(mainWindow)
    mainWindow.show()          # 显示窗口
    exit(app.exec_())          # 运行程序直到关闭

效果,文本是TODO is a food todo,高亮显示时不改变原单词的大小写

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT/PyQT/PySide 通过富文本形式实现关键词高亮 的相关文章

随机推荐

  • MATLAB设计滤波器之新版filterDesigner使用

    一 引言 本篇内容主要介绍新版Matlab的滤波器设计filterDesigner工具的使用 并以设计两个带通滤波器为使用的例子 使用的MATLAB软件版本为MATLAB R2022a 二 filterDesigner设计滤波器 1 在命令
  • C++责任链模式:Chain of Responsibility Pattern

    当你想要让一个以上的对象有机会能够处理某个请求的时候 就可以使用责任链模式 责任链模式 将请求的发送和接收解耦 让多个接收对象都有机会处理这个请求 将这些接收对象串成一条链 并沿着这条链传递这个请求 直到链上的某个接收对象能够处理它为止 通
  • Ubuntu18.04装Miniconda后终端出现base环境

    在 Ubuntu18 04LTS DELL 台式机中安装 Pytorch 由于没有 GPU 只能下载仅使用 CPU 版的 Pytorch 去 Pytorch 官网按照文档 Start Locally PyTorch 一步步下载相应的环境 P
  • tomcat8下启动 jsp报错

    The method getDispatcherType is undefined for the type HttpServletRequest java lang ClassNotFoundException org apache js
  • PLSQL中的FOR循环

    游标的FOR循环 循环体是查询的表 游标的for循环 PL SQL 语言提供了 游标 FOR 循环语句 自动执行游标的 OPEN FETCH CLOSE 语句和 循环 语句的功能 当进入循环时 游标 FOR 循环语句 自动 打开游标 并提取
  • LCD调试流程

    本来想学的更深入一些再来写这些总结 但想想 边学边写 记录成长过程也挺好的 下面自底向上 了解LCD的整个工作流程 一 LCD的组成结构和各结构的功能 1 背光板模组 提供光的来源 2 上下偏光板 TFT Glass Substrate 液
  • 【C/C++学习笔记】c++ 回调函数

    1 介绍 回调函数就是一个通过函数指针调用的函数 如果你把函数的指针 地址 作为参数传递给另一个函数 当这个指针被用来调用其所指向的函数时 我们就说这是回调函数 回调函数不是由该函数的实现方直接调用 而是在特定的事件或条件发生时由另外的一方
  • Maven自动化构建工具详解

    一 Maven概述 1 使用Maven原因 我们先通过企业开发中的实际需求来看一看哪些方面是我们现有技术的不足 1 第三方Jar包添加 在今天的JavaEE开发领域 有大量的第三方框架和工具可以供我们使用 要使用这些jar包最简单的方法就是
  • win7+ubuntu20.04双系统安装,以及pointnet2_pytorch编译记录

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 win7 ubuntu20 04双系统安装 二 Ubuntu安装相关 1 Anaconda 2 Nvidia Driver 3 编译pointnet2 p
  • SSM框架-SpringMVC详解

    springmvc概述 Springmvc是spring框架的一个模块 spring和springmvc无需中间整合层整合 Springmvc是一个基于mvc的web框架 表现层的三大任务 URL到controller的映射 http请求参
  • 【MySQL】20个经典面试题,全部答对月薪10k+

    欢迎加入QQ群讨论更多内容 群号 835870546 原文链接 http bbs 51cto com thread 1470880 1 html Part2 经典题目 1 MySQL的复制原理以及流程 基本原理流程 3个线程以及之间的关联
  • IntelliJ Idea 常用快捷键列表

    IntelliJ Idea 常用快捷键列表 Alt 回车 导入包 自动修正 Ctrl N 查找类 Ctrl Shift N 查找文件 Ctrl Alt L 格式化代码 Ctrl Alt O 优化导入的类和包 Alt Insert 生成代码
  • c++/c混合编程

    一 前言 代码从编写到能执行之前 需要经过编译 链接阶段 通常 编译每一个单元文件会生成目标文件 然后链接器会把各个目标文件链接起来生成可执行性文件 链接器之所以能把目标文件相互之间链接起来 就是通过查找目标文件中的唯一函数符号 即经过编译
  • 飞行管理计算机哪个公司,波音737-700的FMC(飞行管理计算机的讲解) VLN081

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 DEP ARR 进离场页面 第一行是你的起始机场 左1 右1 XXXX ARR gt 右2 HOLD 等待点设置叶面 等待点必须在航路上设置的一个点 并已经如入到LEGS 左1 XX 点的名称
  • 初识设计模式:单例模式

    设计模式 是一种思想 解决一个问题的方法有很多种 编程实现一个解决方法也有很多种 设计模式是一种针对不同问题 设计适合该问题的代码 在保证解决问题的基础上 还要保证能有好的扩展性 再有新需求的时候可以便捷的添加新模块 而非大动干戈的改变整个
  • cocos2d Sprite混合达到水流动效果

    使用Sprite混合setBlendFunc方式达到流动效果 void MainHomeLayer updateWaterFall float dt static float offset 0 if NULL waterFall water
  • Qt获取CPU编号和硬盘序列号

    windows下执行命令除了用cmd之外 还有个东西叫WMIC 非常强大 可以通过他获取很多信息 包括硬件信息 QString frmMain getWMIC const QString cmd 获取cpu名称 wmic cpu get N
  • Pandas中DataFrame数据合并、连接(concat、merge、join)

    最近在工作中 遇到了数据合并 连接的问题 故整理如下 供需要者参考 一 concat 沿着一条轴 将多个对象堆叠到一起 concat方法相当于数据库中的全连接 union all 它不仅可以指定连接的方式 outer join或inner
  • sql注入万能密码总结

    select from admin where username and password 第一种 当你已知管理员账号名为admin时可以直接尝试 admin select from admin where username admin a
  • QT/PyQT/PySide 通过富文本形式实现关键词高亮

    因为本质上都是QT 所以我标题带了QT 这个思路是没问题的 就是用C 得换个语言 最开始想根据之前一篇博客的思路进行高亮 PyQT PySide 文本浏览器跳转到指定行 并高亮指定行 qt 指定行高亮 Toblerone Wind的博客 C