QSyntaxHighlighter

文章介绍了如何使用QSyntaxHighlighter基类来实现自定义的语法高亮显示,通过子类化并重写highlightBlock()函数,结合正则表达式匹配文本并应用格式。同时,提到了rehighlight()、setCurrentBlockUserData()等成员函数的作用,以及如何存储和访问自定义的文本块数据。
摘要由CSDN通过智能技术生成

一、描述

此类用于自定义语法高亮显示规则,是用于实现 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 个字符。

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

7、void setCurrentBlockState(int newState) / int previousBlockState()

文本块有一个数值表示其状态,默认为为-1。

setCurrentBlockState() 设置当前文本块的状态为一个数值。

previousBlockState() 返回语法高亮显示当前块之前的文本块的结束状态。

状态主要用于处理多个文本块的使用同一个样式的情况(如多行注释)。

这种情况需要知道上一个文本块的结束状态。在 highlightBlock() 实现中,可以使用 previousBlockState() 查询上一个文本块的结束状态。解析块后,可以使用setCurrentBlockState() 保存最后一个状态。

以下代码片段来着官方示例:语法高亮器

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值