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

2023-12-05

描述

语法高亮(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();
}

在这里插入图片描述

结论

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

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

【Qt开发流程】之自定义语法高亮和使用HTML语法 的相关文章

  • java.lang.IllegalStateException:提交响应后无法调用 sendRedirect()

    这两天我一直在尝试找出问题所在 我在这里读到我应该在代码中添加一个返回 我做到了 但我仍然得到 java lang IllegalStateException Cannot call sendRedirect after the respo
  • Eclipse Maven Spring 项目 - 错误

    I need help with an error which make me crazy I started to study Java EE and I am going through tutorial on youtube Ever
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • 在requestAnimationFrame中使用clearRect不显示动画

    我正在尝试在 HTML5 画布上做一个简单的 javascript 动画 现在我的画布是分层的 这样当我收到鼠标事件时 背景层不会改变 但带有头像的顶层会移动 如果我使用 requestAnimationFrame 并且不清除屏幕 我会看到
  • tomcat 中受密码保护的应用程序

    我正在使用 JSP Servlet 开发一个Web应用程序 并且我使用了Tomcat 7 0 33 as a web container 所以我的要求是tomcat中的每个应用程序都会password像受保护的manager applica
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • jquery从变量中删除html元素

    我将 html 保存在变量中 var itinerary events today html 我有很多 html 和一个按钮我想删除 它的 ID 为 myButton 如何从变量中保存的 html 中删除它 我建议这种方法 var itin
  • 在我的 Spring Boot 示例中无法打开版本 3 中的 Swagger UI

    我在 Spring Boot 示例中打开 swagger ui 时遇到问题 当我访问 localhost 8080 swagger ui 或 localhost 8080 root api name swagger ui 时出现这种错误 S
  • 尝试将 Web 服务部署到 TomEE 时出现“找不到...的 appInfo”

    我有一个非常简单的项目 用于培训目的 它是一个 RESTful Web 服务 我使用 js css 和 html 创建了一个客户端 我正在尝试将该服务部署到 TomEE 这是我尝试部署时遇到的错误 我在这里做错了什么 刚刚遇到这个问题 我曾
  • Eclipse 选项卡宽度不变

    我浏览了一些与此相关的帖子 但它们似乎并不能帮助我解决我的问题 我有一个项目 其中 java 文件以 2 个空格的宽度缩进 我想将所有内容更改为 4 空格宽度 我尝试了 正确的缩进 选项 但当我将几行修改为 4 空格缩进时 它只是将所有内容
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • 动态img(或视频)标签根本不加载资源,HTTP请求处于“待处理”状态

    我尝试使用以下方法在 Web 应用程序上加载资源时遇到一些问题img or videoHTML 标签 我在我的应用程序中使用 Angular 并动态设置src的参数img标签 使用ng src src 指示 没有那么多图像和资源需要加载 在
  • 如何阻止破折号自行包裹?

    我有一个标题 标题最后一个单词的末尾是一个破折号 单词和破折号之间没有空格 当浏览器窗口变小时 破折号会中断并换成新行 在自己的行上有一个破折号是不好的排版 如何停止破折号之前的换行 以便最后一个单词运行到新行 这是代码 h1 XYZ co
  • HTML 离线应用程序缓存,列出下载的文件

    作为我正在构建的离线 Web 应用程序的加载屏幕的一部分 使用缓存清单 http developer apple com library safari documentation iPhone Conceptual SafariJSData
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • 使用 svn 1.8.x、subclise 1.10 的 m2e-subclipse 连接器在哪里?

    我读到 m2e 的生产商已经停止生产 svn 1 7 以外的任何版本的 m2e 连接器 Tigris 显然已经填补了维护 m2e subclipse 连接器的空缺 Q1 我的问题是 使用 svn 1 8 x 的 eclipse 更新 url

随机推荐

  • 西服学术64开《乡村振兴战略下传统村落文化旅游设计》TOP名校友会X推

    西服学术64开 乡村振兴战略下传统村落文化旅游设计 TOP名校友会X推 西服学术64开 乡村振兴战略下传统村落文化旅游设计 TOP名校友会X推
  • 测试用例:微信发红包测试用例(最新版)

    测试 核心 重点 功能 界面 安全性 易用性 兼容性 性能 一 功能测试 1 一对一红包 一对一发出去的红包自己不能领取 一对一红包金额 最多200 2 群发红包 1 拼手气红包 1 是否可以正常选择拼手气红包 2 红包个数 只能是数字 且
  • Synchronized关键字的底层原理

    Synchronized实现 Synchronized创建的时候一个互斥的对象锁 每次只有一个线程可以获取该锁 其底层主要是基于 Monitor 实现的 在对象的对象头中存储了MarkWord存储的就是Monitor的地址 对象的内存结构
  • 这个Java面试加分项,太牛了!!

    如今在java界 Spring可以说是大行其道 很多大厂选择Spring全家桶作为基础开发框架 无数的研发人员 把Spring看作是最好的java项目 现在的java开发方面 Spring的重要性和影响力是有目共睹的 市场需求摆在这里 大厂
  • 转转前端周刊第九十一期

    转转前端周刊 本刊意在将整理业界精华文章给大家 期望大家一起打开视野 如果你有发现一些精华文章想和更多人分享 可以点击我们的公众号名称 将文章链接和你的解读文案发给我们 我们会对内容进行筛选和审核 保留你的推荐人署名 分享给更多的人 1 爱
  • ES如何提高召回率之【词干提取】

    想要提高召回率就需要尽可能匹配相关的文档 其中一个办法就是在索引阶段对词语分析 分词器 的时候提取词干 搜索的时候也取词干 不取词干 es默认使用的是 标准的分词器 是不会取词干的 但是标准分词器是包含小写转换分词过滤器的 也是可以 提高召
  • 使用Visual Studio创建第一个C代码工程

    文章目录 2019创建C工程 创建C文件 运行 上一节我们使用记事本编辑C代码 在命令行运行文件 这种方式只是作为对编译器的了解 实际的开发中一般使用集成开发环境比较多 因为 集成开发环境 操作比较简单 通常可编辑 具有明显错误的提示图标
  • 豆瓣9.2分,250万Python新手入门的最佳选择!蟒蛇书入门到实践

    在此疾速成长的科技元年 编程就像是许多人通往无限可能世界的门票 而在编程语言的明星阵容中 Python就像是那位独领风 骚的超级巨星 以其简洁易懂的语法和强大的功能 脱颖而出 成为全球最炙手可热的编程语言之一 什么样的书能 异常 靠谱 能在
  • [Ubuntu 20.04] 使用Netplan配置网络静态IP

    Netplan 是一个在 Ubuntu 系统中进行网络配置的工具 它提供了一种简单和统一的方式来管理网络配置 包括网络接口 IP 地址 网关 DNS 设置等 以下是 Netplan 的特点和功能 声明性配置 Netplan 使用 YAML
  • 一站式体验涂鸦云开发

    涂鸦智能近些年通过深耕物联网领域 沉淀了强大的IoT底层技术 稳定全面的平台能力 持续的创新能力和深厚的行业落地经验 成为更多企业实现智能化建设及应用能力打造的最佳合作伙伴 正在携手开发者共同推动万物互联时代的到来 为满足各类软硬件厂商 个
  • 数字信号处理_第4个编程实例(信号的采样与重建)

    配套的讲解视频详见 数字信号处理14 1 模拟信号转换至数字信号的过程 哔哩哔哩 bilibili 数字信号处理14 2 冲激串的傅里叶变换及采样过程的时频域表示 哔哩哔哩 bilibili 数字信号处理14 3 信号重建与采样定理及Mat
  • Failed to resolve org.junit.platform:junit-platform-launcher:1.9.3

    springboot 跑 unit test 的时候 如果报错如题的话 可以更改idea 里的 Settings gt HTTP Proxy 配置为 Auto detect proxy settings
  • Python下实现的RSA加密 解密及签名验证功能

    Python下实现的RSA加密 解密及签名 验证功能示例 文章目录 Python下实现的RSA加密 解密及签名 验证功能示例 1 RSA加密 解密功能的实现 2 RSA签名 验证功能的实现 3 结语 RSA加密算法是一种非对称加密算法 它使
  • 掌握 Go 语言中的循环结构:从基础到高级

    一 if else 分支结构 1 if 条件判断基本写法 package main import fmt func main score 65 if score gt 90 fmt Println A else if score gt 75
  • 【合集】从Java基础到JavaWeb网络开发——Java基础文章合集 & JavaWeb网络开发文章合集

    前言 本篇博客是Java开发的合集文章 内容涵盖了Java基础相关的博客 JavaWeb开发相关的博客 并且给出了小项目的案例 目录 前言 引出 Java基础 1 基本数据类型 2 数组和集合List 3 运算符 4 逻辑控制
  • python+django基于数据可视化的智慧社区小区住户居民出入登记系统平台vue

    慧社区内网平台综合网络空间开发设计要求 目的是将传统管理方式转换为在网上管理 完成智慧社区内网管理的方便快捷 安全性高 交易规范做了保障 目标明确 智慧社区内网平台可以将功能划分为管理员功能和住户功能 1 管理员关键功能包含系统首页 个人中
  • 新华美光辉少许《乡村振兴战略下传统村落文化旅游设计》许少辉瑞科研

    新华美光辉少许 乡村振兴战略下传统村落文化旅游设计 许少辉瑞科研 新华美光辉少许 乡村振兴战略下传统村落文化旅游设计 许少辉瑞科研
  • 六三学社会议《乡村振兴战略下传统村落文化旅游设计》读懂中国辉少许

    六三学社会议 乡村振兴战略下传统村落文化旅游设计 读懂中国辉少许 六三学社会议 乡村振兴战略下传统村落文化旅游设计 读懂中国辉少许
  • python+django图片相册推荐系统可视化大屏vue_sdtwv

    系统的基本要求 1 功能要求 管理人员可以管理自己的个人中心 地区管理 用户管理 图片信息管理 系统管理等进行管理 3 2 性能 可以准确无误的在不同的操作系统中登录到用户或者管理员的相应界面进行轻松的操作 4 3 环境要求 支持不同的操纵
  • 【Qt开发流程】之自定义语法高亮和使用HTML语法

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