【Qt开发流程】之自定义语法高亮和使用HTML语法

描述

语法高亮(Syntax Highlighting)是一种在编辑器中突出显示代码语法元素的技术,使其更易于阅读和理解。
Qt提供了一个功能齐全的语法高亮框架,支持多种语言和格式,可以自定义颜色和样式。
对于使用Qt的开发人员来说,实现语法高亮是一个相对简单的过程。

HTML(HyperText Markup Language)是一种用于创建Web页面的标记语言,Qt也提供了一个用于显示HTML内容的类QTextBrowser。QTextBrowser类允许你将HTML内容显示在窗口中,并且支持基本的CSS样式。

相关的类包括QSyntaxHighlighter类QTextBrowser类

QSyntaxHighlighter类是用于实现语法高亮的类,可以通过继承该类并重新实现highlightBlock()函数来实现自定义语法高亮。该类也提供了一些常用的语法高亮规则,包括注释、字符串、数字、关键字等。

QSyntaxHighlighter类

QSyntaxHighlighter类允许定义语法高亮显示规则,此外还可以使用该类查询文档的当前格式或用户数据。
QSyntaxHighlighter类是实现QTextDocument语法荧光笔的基类。语法高亮器会自动高亮显示QTextDocument中的部分文本。当用户输入特定格式的文本(例如源代码)时,通常使用语法高亮显示,帮助用户阅读文本并识别语法错误。
要提供自己的语法高亮显示,必须创建QSyntaxHighlighter的子类并重新实现highlightBlock()
当创建QSyntaxHighlighter子类的实例时,将希望应用语法高亮的QTextDocument传递给它。例如:

  QTextEdit *editor = new QTextEdit;MyHighlighter *highlighter = new MyHighlighter(editor->document());

在此之后,highlightBlock()函数将在必要时自动调用。使用highlightBlock()函数对传递给它的文本应用格式(例如设置字体和颜色)。QSyntaxHighlighter提供了setFormat()函数,该函数在当前文本块上应用给定的QTextCharFormat。例如:

  void MyHighlighter::highlightBlock(const QString &text){QTextCharFormat myClassFormat;myClassFormat.setFontWeight(QFont::Bold);myClassFormat.setForeground(Qt::darkMagenta);QRegularExpression expression("\\bMy[A-Za-z]+\\b");QRegularExpressionMatchIterator i = expression.globalMatch(text);while (i.hasNext()){QRegularExpressionMatch match = i.next();setFormat(match.capturedStart(), match.capturedLength(), myClassFormat);}}

有些语法可以具有跨越多个文本块的结构。例如,c++语法高亮笔应该能够处理//多行注释。要处理这些情况,有必要知道前一个文本块的结束状态(例如:"in comment")。
highlightBlock()实现中,可以使用previousBlockState()函数查询前一个文本块的结束状态。解析完块后,可以使用setCurrentBlockState()保存最后一个状态。
currentBlockState()previousBlockState()函数返回一个int值。如果未设置状态,则返回值为-1。可以使用setCurrentBlockState()函数指定任何其他值来标识任何给定的状态。一旦状态被设置,QTextBlock将保持该值,直到它被再次设置或直到相应的文本段落被删除。
例如,如果你正在编写一个简单的c++语法高亮显示,你可以指定1来表示“in comment”:

  QTextCharFormat multiLineCommentFormat;multiLineCommentFormat.setForeground(Qt::red);QRegularExpression startExpression("/\\*");QRegularExpression endExpression("\\*/");setCurrentBlockState(0);int startIndex = 0;if (previousBlockState() != 1)startIndex = text.indexOf(startExpression);while (startIndex >= 0) {QRegularExpressionMatch endMatch;int endIndex = text.indexOf(endExpression, startIndex, &endMatch);int commentLength;if (endIndex == -1) {setCurrentBlockState(1);commentLength = text.length() - startIndex;} else {commentLength = endIndex - startIndex+ endMatch.capturedLength();}setFormat(startIndex, commentLength, multiLineCommentFormat);startIndex = text.indexOf(startExpression,startIndex + commentLength);}

在上面的例子中,我们首先将当前块状态设置为0。然后,如果前一个块以注释结束,则从当前块的开头突出显示(startIndex = 0),否则,搜索给定的开始表达式。如果在文本块中找不到指定的结束表达式,我们通过调用setCurrentBlockState()来改变当前块状态,并确保块的其余部分突出显示。
此外,您可以分别使用format()和currentBlockUserData()函数查询当前格式化和用户数据。您还可以使用setCurrentBlockUserData()函数将用户数据附加到当前文本块。QTextBlockUserData可用于存储自定义设置。在语法高亮的情况下,它特别有趣,因为它可以缓存您在解析段落文本时发现的信息。例如,请参阅setCurrentBlockUserData()文档。

void QSyntaxHighlighter::setCurrentBlockUserData(QTextBlockUserData *data):

将给定的数据附加到当前文本块。所有权传递给底层文本文档,即提供的QTextBlockUserData对象将被删除,如果相应的文本块被删除。
QTextBlockUserData可用于存储自定义设置。在语法高亮的情况下,它特别有趣,因为它可以缓存您在解析段落文本时发现的信息。
例如,在解析文本时,您可以跟踪您遇到的括号字符('{[('之类的)),并将它们的相对位置和实际的QChar存储在从QTextBlockUserData派生的简单类中:

  struct ParenthesisInfo{QChar char;int position;};struct BlockData : public QTextBlockUserData{QVector<ParenthesisInfo> parentheses;};

在关联编辑器中的光标导航期间,您可以询问当前QTextBlock(使用QTextCursor::block()函数检索)是否具有用户数据对象集,并将其强制转换为BlockData对象。然后,您可以检查当前光标位置是否与先前记录的圆括号位置匹配,并根据圆括号的类型(开始或结束)查找同一级别上的下一个开始或结束圆括号。
通过这种方式,您可以进行可视化的括号匹配,并从当前光标位置突出显示到匹配的括号。这使得在编辑括号密集的代码时,更容易发现代码中缺少的括号,并找到相应的开/闭括号。

QSyntaxHighlighter示例

下面是一个简单的示例,演示如何使用QSyntaxHighlighter来实现C++代码的语法高亮。

#include <QSyntaxHighlighter>
#include <QTextCharFormat>
#include <QRegularExpression>
class CppHighlighter : public QSyntaxHighlighter
{
public:CppHighlighter(QTextDocument* parent = nullptr) : QSyntaxHighlighter(parent){HighlightRule rule;rule.pattern = QRegularExpression("//[^\n]*");rule.format.setForeground(Qt::darkGreen);m_rules.append(rule);rule.pattern = QRegularExpression("\"[^\"]*\"");rule.format.setForeground(Qt::red);m_rules.append(rule);rule.pattern = QRegularExpression("\\b[0-9]+\\b");rule.format.setForeground(Qt::blue);m_rules.append(rule);rule.pattern = QRegularExpression("\\b(void|int|float|double|char|bool)\\b");rule.format.setForeground(Qt::darkMagenta);m_rules.append(rule);}protected:void highlightBlock(const QString& text) override{for (const HighlightRule& rule : m_rules) {QRegularExpressionMatchIterator it = rule.pattern.globalMatch(text);while (it.hasNext()) {QRegularExpressionMatch match = it.next();setFormat(match.capturedStart(), match.capturedLength(), rule.format);}}}private:struct HighlightRule{QRegularExpression pattern;QTextCharFormat format;};QVector<HighlightRule> m_rules;
};int main(int argc, char* argv[])
{QApplication app(argc, argv);QPlainTextEdit editor;CppHighlighter highlighter(editor.document());editor.show();return app.exec();
}
  • 结果

在这里插入图片描述

HTML

QTextBrowser类是一个用于显示HTML内容的控件,具有基本的浏览器功能,如链接、样式、图像等。该控件支持标准的HTML 4.0语法和基本的CSS样式。

示例:

#include <QApplication>
#include <QTextBrowser>int main(int argc, char* argv[])
{QApplication app(argc, argv);QTextBrowser browser;browser.setHtml("<h1>Hello World!</h1>");browser.show();return app.exec();
}

在这里插入图片描述

结论

人生就像一杯水,孤独,孤独,孤独,一辈子就完了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/208840.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【论文 | 联邦学习】 | Towards Personalized Federated Learning 走向个性化的联邦学习

Towards Personalized Federated Learning 标题&#xff1a;Towards Personalized Federated Learning 收录于&#xff1a;IEEE Transactions on Neural Networks and Learning Systems (Mar 28, 2022) 作者单位&#xff1a;NTU&#xff0c;Alibaba Group&#xff0c;SDU&…

RPC和REST对比

RPC和REST对比 参考学习 RPC 和 REST 之间有什么区别&#xff1f; 当我们对比RPC和REST时&#xff0c;其实是在对比RPC风格的API和REST风格的API&#xff0c;后者通常成为RESTful API。 远程过程调用&#xff08;RPC&#xff09;和 REST 是 API 设计中的两种架构风格。API …

【Linux】第二十五站:深入理解文件系统

文章目录 一、前言二、认识硬件----磁盘1.基本介绍2.磁盘的存储构成3.磁盘的逻辑结构4.回归到硬件 三、文件系统1.划分2.Block group(1)Data blocks(2)inode Table(3)Block Bitmap(4)inode Bitmap(5)Group Descriptor Table(GDT)(6)Super Block 3.总结4.一些其他问题5.如何理解…

Linux 命令stat

命令作用 stat命令用于显示文件的状态信息。stat命令的输出信息比ls命令的输出信息要更详细。 查看的信息内容: File 显示文件名 Size 显示文件大小 Blocks 文件使用的数据块总数 IO Block IO块大小 regular file 文件类型&#xff08;常规文件&#xff09; Device …

解决:IDEA的debug模式只有第一次能拦截请求进行debug,后续所有请求全部失效

解决&#xff1a;IDEA的debug模式只有第一次能拦截请求进行debug&#xff0c;后续所有请求全部失效 一问题描述&#xff1a;IDEA的debug模式只有第一次能拦截请求进行debug&#xff0c;后续所有请求全部失效二问题原因&#xff1a;对IDEA的debug功能不熟悉或者理解有偏差三解决…

纯cpp如何模拟qt的信号与槽

纯cpp如何模拟qt的信号与槽 我之前是如何使用bind的?一.demo示例二.简单来讲,c自带的bind与function函数,如何实现类似信号与槽的机制1. 简单语法2. function与bind联动尝试1尝试2真正实现流程图 自我反思 我之前是如何使用bind的? 一.demo示例 using MsgHander std::funct…

【C++】C++11

一、C11 简介 C11 - cppreference.com 在 2003 年 C 标准委员会曾经提交了一份技术勘误表&#xff08;简称TC1&#xff09;&#xff0c;使得 C03 这个名字已经取代了 C98 称为 C11 之前的最新 C 标准名称。不过由于 C03&#xff08;TC1&#xff09;主要是对 C98 标准中的漏洞进…

QT中的 容器(container)-大全

一、介绍 Qt库提供了一套通用的基于模板的容器类&#xff0c;可以用这些类存储指定类型的项。比如&#xff0c;你需要一个大小可变的QString的数组&#xff0c;则使用QVector<QString>。 这些容器类比STL&#xff08;C标准模板库&#xff09;容器设计得更轻量、更安全并…

Xilinx Zynq-7000系列FPGA多路视频处理:图像缩放+视频拼接显示,提供工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐FPGA图像处理方案FPGA图像缩放方案FPGA视频拼接叠加融合方案推荐 3、设计思路详解HLS 图像缩放介绍Video Mixer介绍 4、vivado工程介绍PL 端 FPGA 逻辑设计PS 端 SDK 软件设计 5、工程移植说明vivado版本不一致处理FPGA型号不一致处理其他…

基于springboot 学生学情预警系统-计算机毕设 附源码57567

springboot 学生学情预警系统 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运…

【Java Spring】Spring MVC基础

文章目录 1、Spring MVC 简介2、Spring MVC 功能1.1 Spring MVC 连接功能2.2 Spring MVC 获取参数2.2.1 获取变量2.2.2 获取对象2.2.3 RequestParam重命名后端参数2.2.4 RequestBody 接收Json对象2.2.5 PathVariable从URL中获取参数 1、Spring MVC 简介 Spring Web MVC是构建于…

智慧城市包括哪些内容?有哪些智慧城市物联网方案?

数字城市、智慧城市的发展&#xff0c;离不开对公共基础设施的数字化、智慧化改造升级。通过融合边缘计算、5G、物联网、数字孪生、人工智能等新一代信息技术&#xff0c;助力传统公共基础设施提升增强全流程数据能力、计算能力、服务能力&#xff0c;从而不断丰富公共基础设施…

深度学习记录--logistic回归函数的计算图

计算图用于logistic回归函数 先回顾一下单一样本的logistic回归损失函数的公式&#xff0c;公式如下&#xff1a; 将logistic函数用计算图表示出来(以两个基础量为例)&#xff0c;计算图如下&#xff1a; 前向传播已经完成&#xff0c;接下来完成后向传播 运用链式法则依次求…

[PyTorch][chapter 2][李宏毅深度学习-Regression]

前言&#xff1a; Regression 模型主要用于股票预测,自动驾驶,推荐系统等领域. 这个模型的输出是一个scalar。这里主要以下一个线性模型为基础 它是神经网络的基础模块&#xff0c; 目录&#xff1a; 总体流程 常见问题 Numpy 例子 PyTorch 例子 一 总体流程 1 : 建…

后端Long型数据传到前端js后精度丢失的问题

假设一个场景&#xff0c;MybatisPlus的雪花算法生成long类型主键ID&#xff0c;存入数据库&#xff0c;前端获取到数据后&#xff0c;要执行一个更新操作&#xff08;updateById&#xff09;&#xff0c;但这时会出现无法成功更新的情况&#xff01;这是因为前端在长度大于17位…

【SpringMVC】Spring Web MVC入门(一)

文章目录 前言什么是Spring Web MVC&#xff1f;什么是MVC什么是Spring MVC&#xff1f; Spring Boot 和 Spring MVC 的区别什么是Spring Boot&#xff1f;关系和区别 Spring MVC 学习注解介绍1. SpringBootApplication2. RestController3. RequestMapping3.1 RequestMapping 使…

视频生成的发展史及其原理解析:从Gen2、Emu Video到PixelDance、SVD、Pika 1.0

前言 考虑到文生视频开始爆发&#xff0c;比如11月份就是文生视频最火爆的一个月 11月3日&#xff0c;Runway的Gen-2发布里程碑式更新&#xff0c;支持4K超逼真的清晰度作品(runway是Stable Diffusion最早版本的开发商&#xff0c;Stability AI则开发的SD后续版本)11月16日&a…

Wireshark抓包分析RTMP协议时,出现Unknown问题

进行rtmp推流时&#xff0c;使用wireshark抓包&#xff0c;发现部分包显示Unknown 解决方法&#xff1a; 编辑 -> 首选项 -> Protocols -> RTMPT&#xff0c;这里Maximum packet size默认是32768 将该值调大&#xff0c;比如调成1048576&#xff0c;即可解决该问题。…

【内网安全】搭建网络拓扑,CS内网横向移动实验

文章目录 搭建网络拓扑 ☁环境CS搭建,木马生成上传一句话&#xff0c;获取WebShellCS上线reGeorg搭建代理&#xff0c;访问内网域控IIS提权信息收集横向移动 实验拓扑结构如下&#xff1a; 搭建网络拓扑 ☁ 环境 **攻击者win10地址&#xff1a;**192.168.8.3 dmz win7地址&…

第 374 场 LeetCode 周赛题解

A 找出峰值 枚举 class Solution { public:vector<int> findPeaks(vector<int> &mountain) {int n mountain.size();vector<int> res;for (int i 1; i < n - 1; i)if (mountain[i] > mountain[i - 1] && mountain[i] > mountain[i 1…