当前位置: 首页 > article >正文

qt QSyntaxHighlighter详解

1、概述

QSyntaxHighlighter是Qt文本处理框架中的一个强大工具,它专门用于实现文本编辑器中的语法高亮功能。通过自定义高亮规则,QSyntaxHighlighter可以实现对代码编辑器、富文本编辑器中的关键字、注释等内容的高亮显示。这一功能对于提升代码的可读性和编辑效率具有重要意义。

2、重要方法
  • QSyntaxHighlighter(QObject *parent):通过父对象构造。
  • QSyntaxHighlighter(QTextDocument *parent):通过文本文档构造。
  • void setDocument(QTextDocument *doc):设置语法高亮器关联的文本文档。
  • QTextDocument *document()const:返回语法高亮器关联的文本文档
  • virtual void highlightBlock(const Qstring &text):纯虚函数,需要在子类中实现,用于高亮显示指定文本块。
     
//.h
class SyntaxHighlighter : public QSyntaxHighlighter
{
    Q_OBJECT

public:
    SyntaxHighlighter(QTextDocument *parent = nullptr);

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

private:
    void setupHighlightingRules();

    struct HighlightingRule
    {
        QRegExp pattern;
        QTextCharFormat format;
    };
    QVector<HighlightingRule> highlightingRules;

    QTextCharFormat keywordFormat;
    QTextCharFormat commentFormat;
};




//.cpp
SyntaxHighlighter::SyntaxHighlighter(QTextDocument *parent)
    : QSyntaxHighlighter(parent)
{
    setupHighlightingRules();
}

void SyntaxHighlighter::setupHighlightingRules()
{
    HighlightingRule rule;

    // 关键字高亮规则
    keywordFormat.setForeground(Qt::blue);
    keywordFormat.setFontWeight(QFont::Bold);
    QStringList keywordPatterns;
    keywordPatterns << "\\bint\\b" << "\\bfloat\\b" << "\\bdouble\\b" << "\\bchar\\b"
                    << "\\bvoid\\b" << "\\bif\\b" << "\\belse\\b" << "\\bfor\\b"
                    << "\\bwhile\\b" << "\\breturn\\b";
    foreach (const QString &pattern, keywordPatterns) {
        rule.pattern = QRegExp(pattern);
        rule.format = keywordFormat;
        highlightingRules.append(rule);
    }

    // 注释高亮规则
    commentFormat.setForeground(Qt::darkGray);
    commentFormat.setFontItalic(true);
    rule.pattern = QRegExp("//[^\n]*");
    rule.format = commentFormat;
    highlightingRules.append(rule);
}

void SyntaxHighlighter::highlightBlock(const QString &text)
{
    foreach (const HighlightingRule &rule, highlightingRules) {
        QRegExp expression(rule.pattern);
        int index = expression.indexIn(text);
        while (index >= 0) {
            int length = expression.matchedLength();
            setFormat(index, length, rule.format);
            index = expression.indexIn(text, index + length);
        }
    }
}


//main.cpp
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTextEdit textEdit;
    textEdit.setPlainText("int main() { if (true) { return 0; } }"); // 设置示例文本

    // 创建并应用Highlighter实例
    SyntaxHighlighter *highlighter = new SyntaxHighlighter(textEdit.document());

    textEdit.show();

    return a.exec();
}

觉得有帮助的话,打赏一下呗。。

           


http://www.kler.cn/a/385908.html

相关文章:

  • 如何解决传统能源企业后备人才不足、人才规划缺失问题
  • IDEA启动JavaEE启动控制台乱码或者jsp等页面乱码
  • 【pytorch】Mujoco + 常用强化学习算法(持续更新)
  • npm安装记录
  • 羽星股份引领连锁业数智化转型,厦门羽星科技公司逆势增长剑指纳斯达克
  • HCIP-HarmonyOS Application Developer 习题(二十)
  • Java实现营业执照OCR识别API接口
  • Spring Mvc中拦截器Interceptor详解
  • Dify 本地部署指南
  • 解决方案 | 部署更快,自动化程度高!TOSUN同星线控底盘解决方案
  • spring boot 项目配置https服务
  • Terraform-阿里云- ECS实验
  • 微服务设计模式 - 事件溯源模式(Event Sourcing Pattern)
  • [Redis] Redis哨兵机制
  • python安装selenium,geckodriver,chromedriver,Selenium IDE
  • 学习笔记:黑马程序员JavaWeb开发教程(2024.11.8)
  • flink 内存配置(一):设置Flink进程内存
  • 设计模式小结一观察者(Observer)模式
  • 如何在微服务架构中优化微信 Access Token 管理:解决频率限制与过期问题的最佳实践
  • 哈夫曼树(HuffmanTree)