QSyntaxHighlighter

news2025/1/13 7:57:33

一、描述

此类用于自定义语法高亮显示规则,是用于实现 QTextDocument 文本高亮显示的基类。

要自定义语法高亮显示,必须子类化 QSyntaxHighlighter 并重新实现 highlightBlock()。此函数将在合适的时机自动被调用。

highlightBlock() 函数将格式设置应用于传递给它的文本。setFormat() 函数将给定的QTextCharFormat 应用于当前文本块。例如:

class MyHighlighter : public QSyntaxHighlighter
{
    Q_OBJECT
public:
    MyHighlighter(QTextDocument *parent = nullptr)
        : QSyntaxHighlighter(parent)
    {
    }

protected:
    void highlightBlock(const QString &text) override;
};

void MyHighlighter::highlightBlock(const QString &text)
{
    QTextCharFormat matchFormat;
    matchFormat.setFontWeight(QFont::Bold);
    matchFormat.setForeground(Qt::red);

    static QRegularExpression expression{"\\bname=[A-Za-z]+\\b"};
    QRegularExpressionMatchIterator i = expression.globalMatch(text);
    while (i.hasNext())
    {
        QRegularExpressionMatch match = i.next();
        setFormat(match.capturedStart(), match.capturedLength(), matchFormat);
    }
}
    MyHighlighter *highlighter = new MyHighlighter(ui->textEdit->document());

编辑框中匹配正则表达式的内容被设置为指定的格式。

二、成员函数

1、void rehighlight()

将高亮显示重新应用于整个文档。

2、void rehighlightBlock(const QTextBlock &block)

将高亮显示重新应用于文本块。

3、QTextBlock currentBlock()

当前文本块。

4、void highlightBlock(const QString &text)

高亮显示给定的文本块。富文本引擎在必要时调用此函数,即在已更改的文本块上调用。

5、void setCurrentBlockUserData(QTextBlockUserData *data)

QTextBlockUserData 类用于将自定义数据与文本块相关联。

此函数将 data 附着到当前文本块。

struct info
{
    QString name;
    int age;
};

struct BlockData : public QTextBlockUserData
{
    QList<info> infoList;
};

class MyHighlighter : public QSyntaxHighlighter
{
    Q_OBJECT
public:
    MyHighlighter(QTextDocument *parent = nullptr)
        : QSyntaxHighlighter(parent)
    {
    }

protected:
    void highlightBlock(const QString &text) override;
};


void MyHighlighter::highlightBlock(const QString &text)
{
    QTextCharFormat matchFormat;
    matchFormat.setFontWeight(QFont::Bold);
    matchFormat.setForeground(Qt::red);

    static QRegularExpression expression{"\\bname=[A-Za-z]+\\b"};
    QRegularExpressionMatchIterator i = expression.globalMatch(text);
    int number{1};
    while (i.hasNext())
    {
        QRegularExpressionMatch match = i.next();
        setFormat(match.capturedStart(), match.capturedLength(), matchFormat);

        QList<info> infoList;

        info data;
        data.name = QString("name%1").arg(number);
        data.age = number;
        infoList << data;
        ++number;

        data.name = QString("name%1").arg(number);
        data.age = number;
        infoList << data;
        ++number;

        BlockData * bd = new BlockData;
        bd->infoList = infoList;
        setCurrentBlockUserData(bd);
    }
}

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    MyHighlighter *highlighter = new MyHighlighter(ui->textEdit->document());
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushButton_clicked()
{
    QTextBlock currentBlock = ui->textEdit->document()->begin();
    while (currentBlock.isValid())
    {
        currentBlock = currentBlock.next();
        if(auto bd = static_cast<BlockData*>(currentBlock.userData()))
        {
            qDebug()<<"xxx";
            for(const info &data : bd->infoList)
            {
                qDebug()<<data.name;
                qDebug()<<data.age;
            }
        }
    }
}

6、void setFormat(int start, int count, const QTextCharFormat &format)

      void setFormat(int start, int count, const QColor &color)

此函数应用于语法高亮显示的当前文本块(即传递给 highlightBlock() 函数的文本)。

指定的格式 format 从 start 位置应用于文本,长度为 count 个字符(如果count为0,则不执行任何操作)。

通过此函数设置的格式不会修改文档本身。

      void setFormat(int start, int count, const QFont &font)

      void setFormat(int start, int count, const QColor &color)

指定的字体 / 颜色从 start 位置应用于当前文本块,长度为 count 个字符。

当前文本块的其他属性(例如字体和背景色)将重置为默认值。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SOFA Weekly|SOFANews、本周贡献 issue 精选

SOFA WEEKLY | 每周精选 筛选每周精华问答&#xff0c;同步开源进展欢迎留言互动&#xff5e;SOFAStack&#xff08;Scalable Open Financial Architecture Stack&#xff09;是蚂蚁集团自主研发的金融级云原生架构&#xff0c;包含了构建金融级云原生架构所需的各个组件&#…

Rasa 3.x 学习系列-Rasa [3.4.0] - 2022-12-14新版本发布

Rasa 3.x 学习系列-Rasa [3.4.0] - 2022-12-14新版本发布 任何人都可以学习Rasa之优秀Rasa学习资源推荐 欢迎同学们报名Gavin老师的Rasa系列课程,任何人都可以学习Rasa之优秀Rasa学习资源推荐: 1.NLP on Transformers高手之路137课 2 .Rasa 3.X 智能对话机器人案例开发硬核…

五、k8s pod详解

文章目录1 pod介绍1.1 pod 定义2 pod配置2.1 基本配置2.2 镜像拉取2.3 启动命令2.4 环境变量2.5 端口设置2.6 资源配额3 Pod生命周期3.1 创建和终止3.2 初始化容器3.3 钩子函数3.4 容器探测3.5 重启策略4 Pod调度4.1 定向调度4.2 亲和性调度5 污点和容忍5.1 污点&#xff08;Ta…

做短视频必须了解的6个问题,你知道几个答案呢?

做短视频必须了解的6个问题&#xff0c;你知道几个答案呢&#xff1f; 最近好多朋友问了视频运营和创作的问题&#xff0c;把其中六个有代表性的问题和答案汇总在一起&#xff0c;公开给大家&#xff0c;希望对大家有所帮助。 1、账号被限流了怎么办&#xff1f; 随手拍十条…

聚观早报 | 小米同时研发两款车;谷歌计划向印度最高法院上诉

小米同时研发两款车&#xff1a;谷歌计划向印度最高法院上诉&#xff1b;苹果AR/MR头显部件延迟发货&#xff1b;2022年特斯拉在德汽车销量激增&#xff1b;纽约市教育部门禁止访问 ChatGPT 小米同时研发两款车小米第一款车为中型溜背式轿车&#xff08;内部代号 Modena 摩德纳…

欧科云链任煜男:推动区块链创新,切忌陷入“过度金融化”的桎梏

FTX破产轰动全球&#xff0c;揭示的是监管出现问题。FTX作为行业龙头&#xff0c;持有多国牌照却依然“暴雷”&#xff0c;未来到底应如何监管加密资产行业&#xff1f;针对这一问题&#xff0c;欧科云链控股(01499.HK)公司执行董事、董事局主席兼行政总裁任煜男近日在接受香港…

【菜菜的CV进阶之路 - 深度学习环境搭建】windows+ubuntu20.04双系统安装

新学期&#xff0c;配了台新电脑&#xff08;双路2080ti5800x64GB内存500GB固态2TB机械&#xff09;&#xff0c;师兄忙于毕设&#xff0c;没给装ubuntu&#xff0c;自己装一下咯~ 一、前期准备 1、空U盘一个 2、Ubuntu 20.04 LTS镜像 3、启动U盘制作软件&#xff08;我用的…

STM51嵌入式开发入门软件安装-Keil、stc、驱动

STM51嵌入式开发入门软件安装-Keil、stc、驱动 STM51嵌入式开发入门软件安装-Keil、stc、驱动 1 Keil安装 1.1 百度进入官网 1.2 选择C51,点击后需要填的信息随便填 下载好的软件链接&#xff1a;https://pan.baidu.com/s/19wxkLD69QpmPNr27KYRAxw?pwdyihl 提取码&#xff1a…

【web】微信小程序笔记小结(简介)

准备参加计算机设计大赛owo 疯狂学习微信小程序ing js也在努力兼顾kkk 写完想搞个目录结果老是跳转有问题orz&#xff0c;所以这一篇没有目录了qwq 来源&#xff1a;黑马程序员前端微信小程序开发教程 I. 小程序与普通网页的区别 ① 运行环境 网页 → 浏览器环境 小…

自定义指令binding参数

除了核心功能默认内置的指令 (v-model 和 v-show)&#xff0c;Vue 也允许注册自定义指令。注意&#xff0c;在 Vue2.0 中&#xff0c;代码复用和抽象的主要形式是组件。然而&#xff0c;有的情况下&#xff0c;你仍然需要对普通 DOM 元素进行底层操作 如果想注册局部指令&#…

自定义viewGroup

案例分析&#xff1a;继承自extends LinearLayoutpublic class MainTabBarView extends LinearLayout实现3个方法public MainTabBarView(Context context) {this(context, null);}public MainTabBarView(Context context, Nullable AttributeSet attrs) {this(context, attrs, …

Kettle--MySQL生产数据库千万、亿级数据量迁移方案及性能优化

一、Kettle环境搭建 一、Windows主要用于可视化创建数据迁移用到的ktr转换脚本、kjb作业脚本&#xff0c;以及脚本需要配置的DB2信息、读写性能优化信息等&#xff0c;也可直接在客户端完成不同数据库之间的数据迁移。 测试库表及数据 &#xff08;1&#xff09;创建测试库表…

PVE安装win10并开启远程桌面

接上一篇一、win10安装镜像最新版下载下载地址&#xff1a;https://next.itellyou.cn/现在的win10最新版时22h2,文件名为zh-cn_windows_10_business_editions_version_22h2_updated_dec_2022_x64_dvd_cde06342.iso如果对更新有要求&#xff0c;建议每月跟踪下载一次二、上传win…

IRCNN-FPOCS 代码解读(1):整体框架

0 前言 按照自己实现论文代码的思路&#xff0c;去研究作者的代码&#xff0c;找到自己的知识盲区和不足&#xff0c;提升编码技能。 本模块主要介绍代码实现思路。细节分析详见后续博客。 1、合成地震数据 利用波动方程&#xff1f;&#xff1f;&#xff1f;合成数据&…

JavaScript的“神奇”之处

JavaScript 是一门很棒的语言。它的语法简单&#xff0c;生态系统也很庞大&#xff0c;最重要的是&#xff0c;它拥有最伟大的社区力量。我们知道&#xff0c;JavaScript 是一个非常有趣的语言&#xff0c;但同时也充满了各种奇怪的行为。让我们一起来看一下吧~ example 数组…

Weston 窗口管理(2)

窗口管理(2) 本文基于 weston 分支 10.0.2 进行描述. 五、概述 本文为窗口管理(1)的续章,更多站在开发者角度,以 weston 的代码实现讲解窗口管理(1)中所实现的部分业务场景. 六、数据结构 在窗口管理(1)中曾经描述过 weston 具体的分层逻辑,如下: 再进一步可以把 WESTON_LAY…

关于grpc的第一次尝试

自己瞎琢磨的&#xff0c;有错勿怪。 一、rpc理解 微服务会在不同的端口使用不同的语言提供相异的服务&#xff0c;端口之间的通信就使用rpc。这边的grpc的“g”我原先意味是golang&#xff0c;后来发现是google。 在golang关于rpc的官方包中&#xff0c;rpc主要有使用http/…

(7)Qt中的自定义槽(函数)

目录 槽函数定义的规则 关联信号与槽错误的示例 类成员函数函数做槽函数使用 静态类成员函数做槽函数使用 全局函数做槽函数使用 lambda表达式做槽函数使用 使用lambda表达式的注意事项 注意事项一&#xff1a; 注意事项二&#xff1a; 槽函数定义的规则 1.槽函数返回值…

多图解析KMP算法原理

KMP是什么 KMP是一种字符串匹配算法&#xff0c;能够判断字符串s2&#xff0c;是否为字符串s1的子串 例如&#xff1a;s1 "abd123def"&#xff0c;s2 "123"&#xff0c;KMP会返回4&#xff0c;代表s2是s1的子串&#xff0c;第一个匹配的下标为3 假设s…

线程池及源码分析

目录 1 java构建线程的方式 2 线程池的7个参数 3 线程池属性标识&线程池的状态 3.1 核心属性 3.2 线程池的状态 4 线程池的执行流程 5 添加工作线程的流程 6 Worker的封装&后续任务的处理 1 java构建线程的方式 一般就3~4种&#xff1a; 继承Thread&#xff…