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

    }

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

相关推荐
Larry_Yanan12 小时前
QML学习笔记(三十四)QML的GroupBox、RadioButton
c++·笔记·qt·学习·ui
ajassi200014 小时前
开源 C++ QT QML 开发(十七)进程--LocalSocket
c++·qt·开源
kyle~17 小时前
Qt---setAttribute设置控件或窗口的内部属性
服务器·前端·c++·qt
四维碎片17 小时前
【Qt】乌班图安装Qt环境
开发语言·数据库·qt
蓝天智能18 小时前
QT MVC中Model的特点及使用注意事项
qt·mvc
woshigaowei514620 小时前
VS(QT)调用Matlab函数的方法
qt·matlab·vs
泽虞20 小时前
《Qt应用开发》笔记p2
linux·开发语言·数据库·c++·笔记·qt
应用市场1 天前
Qt插件机制实现动态组件加载详解
开发语言·qt
星源~1 天前
Linux-Ubuntu系统安装特别指导
linux·qt·ubuntu·嵌入式开发·物联网设备
泽虞1 天前
《Qt应用开发》笔记p3
linux·开发语言·数据库·c++·笔记·qt·面试