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

    }

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

相关推荐
雨田言炎5 小时前
十、QThread多线程
linux·服务器·开发语言·前端·qt
常乐か1 天前
在 Ubuntu 24.04 中编译 Qt 5.15.2 项目完全指南
linux·qt·ubuntu
沫璃染墨1 天前
《Qt从零入门系列(二):Qt开发环境搭建——从Qt Creator到SDK配置》
c++·ide·qt
我是小灰灰吖1 天前
Ubuntu 22.04 切换为 X11 会话以解决 QT 桌面程序兼容性问题
linux·qt·ubuntu
≮傷£≯√1 天前
QT配置FFmpeg
开发语言·qt·ffmpeg
≮傷£≯√1 天前
配置 opencv Qt项目
人工智能·qt·opencv
qq_401700411 天前
Qt Modbus协议0x00
开发语言·qt
Zenova EdgeOS1 天前
C++ 工业边缘 Qt 桌面应用实战:从 QWidget 到模型视图、网络与多线程
网络·c++·qt
沫璃染墨2 天前
《Qt从零入门系列(一):Qt框架初识——从发展历史到跨平台开发》
c++·qt·系统架构·gui
郝学胜-神的一滴3 天前
Qt 高级编程 040:按钮悬浮弹出滑块弹窗的完整攻略
开发语言·c++·qt·软件工程·用户界面