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

    }

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

相关推荐
小丑西瓜66610 小时前
qt ui设计案例--登录界面
qt·ui·c/c++·qss
内蒙深海大鲨鱼15 小时前
qt之ui开发
数据库·qt·ui
我有一颗薄荷糖16 小时前
Qt--命令行终端程序开发
开发语言·数据库·qt
码农客栈21 小时前
qt QTextFrame详解
qt
小狮子安度因21 小时前
Qt文件系统-二进制文件读写
qt
朱小勇本勇1 天前
QtLua
qt·lua
hbhhww1 天前
qt中属性的各枚举值含义
开发语言·数据库·qt
重生之我是数学王子1 天前
设计字符串类 运算符重载 C++实现 QT环境
c++·qt
跟着杰哥学嵌入式1 天前
Qt_day7_文件IO
开发语言·qt
jjjxxxhhh1231 天前
Qt 项目架构设计
开发语言·qt