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();

    }

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

相关推荐
十秒耿直拆包选手9 小时前
Qt:主窗体(QMainwindow)初始化注意事项
c++·qt
-凌凌漆-16 小时前
【Qt】Qt QML json处理
开发语言·qt·json
海天鹰19 小时前
Qt:图片切割
qt
做一个坚强的女汉子21 小时前
QT保存日志到文件中以及捕捉崩溃日志
开发语言·qt
顾苏洋199021 小时前
qt绘制饼状图并实现点击即放大点击部分
开发语言·qt
笑鸿的学习笔记1 天前
qt-C++笔记之布局管理`space` 和 `margin`的区别
c++·笔记·qt
轩情吖1 天前
Qt常用控件之QWidget(一)
c++·qt·geometry·qwidget·qpushbutton·客户端开发·enabled
没学上了1 天前
Qt去噪面板搭建
开发语言·qt
peihexian1 天前
vcpkg交叉编译qt等过程记录(未完成)
开发语言·qt
byxdaz1 天前
Qt中的QObject::moveToThread方法详解
qt