【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语法 的相关文章

随机推荐

  • 西服学术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的开发人员来说 实现语法高