Qt的语法高亮类(注释方式)

  1 //语法高亮---QSyntaxHighlighter
  2 //highlighter.h
  3 class Highlighter : public QSyntaxHighlighter    //定义一个类继承自QSyntaxHightliaghter
  4 {
  5     Q_OBJECT                                         //Qt宏定义,使用Qt元编程
  6
  7 public:
  8     Highlighter(QTextDocument *parent = 0);      //构造函数,传递一个QTextDocument对象给其父类
  9
 10 protected:
 11     void highlightBlock(const QString &text) Q_DECL_OVERRIDE;    //块高亮使用的函数,自动调用
 12
 13 private:
 14     struct HighlightingRule                    //语法规则结构体,包含正则表达式模式串和匹配的样式
 15     {
 16         QRegExp pattern;
 17         QTextCharFormat format;
 18     };
 19     QVector<HighlightingRule> highlightingRules;    //规则的集合,可以定义多个高亮规则
 20
 21     QRegExp commentStartExpression;                //注释的高亮,使用highliangBlock()匹配,下文提到
 22     QRegExp commentEndExpression;
 23
 24     QTextCharFormat keywordFormat;                //高亮样式,关键词,一下顾名思义
 25     QTextCharFormat classFormat;
 26     QTextCharFormat singleLineCommentFormat;
 27     QTextCharFormat multiLineCommentFormat;
 28     QTextCharFormat quotationFormat;
 29     QTextCharFormat functionFormat;
 30 };
 31
 32 //highlighter.c
 33 #include "highlighter.h"
 34
 35 Highlighter::Highlighter(QTextDocument *parent)    //构造函数,主要是对词语的高亮
 36     : QSyntaxHighlighter(parent)
 37 {
 38     HighlightingRule rule;                            //高亮规则
 39
 40     keywordFormat.setForeground(Qt::darkBlue);    //设定关键词的高亮样式
 41     keywordFormat.setFontWeight(QFont::Bold);
 42     QStringList keywordPatterns;                    //关键词集合,关键都以正则表达式表示
 43     keywordPatterns << "\\bchar\\b" << "\\bclass\\b" << "\\bconst\\b"
 44                     << "\\bdouble\\b" << "\\benum\\b" << "\\bexplicit\\b"
 45                     << "\\bfriend\\b" << "\\binline\\b" << "\\bint\\b"
 46                     << "\\blong\\b" << "\\bnamespace\\b" << "\\boperator\\b"
 47                     << "\\bprivate\\b" << "\\bprotected\\b" << "\\bpublic\\b"
 48                     << "\\bshort\\b" << "\\bsignals\\b" << "\\bsigned\\b"
 49                     << "\\bslots\\b" << "\\bstatic\\b" << "\\bstruct\\b"
 50                     << "\\btemplate\\b" << "\\btypedef\\b" << "\\btypename\\b"
 51                     << "\\bunion\\b" << "\\bunsigned\\b" << "\\bvirtual\\b"
 52                     << "\\bvoid\\b" << "\\bvolatile\\b";
 53     foreach (const QString &pattern, keywordPatterns) {    //添加各个关键词到高亮规则中
 54         rule.pattern = QRegExp(pattern);
 55         rule.format = keywordFormat;
 56         highlightingRules.append(rule);
 57     }
 58
 59     classFormat.setFontWeight(QFont::Bold);        //添加Qt的类到高亮规则中
 60     classFormat.setForeground(Qt::darkMagenta);
 61     rule.pattern = QRegExp("\\bQ[A-Za-z]+\\b");
 62     rule.format = classFormat;
 63     highlightingRules.append(rule);
 64
 65     singleLineCommentFormat.setForeground(Qt::red);    //单行注释
 66     rule.pattern = QRegExp("//[^\n]*");
 67     rule.format = singleLineCommentFormat;
 68     highlightingRules.append(rule);
 69
 70     multiLineCommentFormat.setForeground(Qt::red);    //多行注释,只设定了样式,具体匹配在highlightBlock中设置
 71
 72
 73     quotationFormat.setForeground(Qt::darkGreen);    //字符串
 74     rule.pattern = QRegExp("\".*\"");
 75     rule.format = quotationFormat;
 76     highlightingRules.append(rule);
 77
 78
 79     functionFormat.setFontItalic(true);        //函数
 80     functionFormat.setForeground(Qt::blue);
 81     rule.pattern = QRegExp("\\b[A-Za-z0-9_]+(?=\\()");
 82     rule.format = functionFormat;
 83     highlightingRules.append(rule);
 84
 85
 86     commentStartExpression = QRegExp("/\\*");        //多行注释的匹配正则表达式
 87     commentEndExpression = QRegExp("\\*/");
 88 }
 89
 90
 91 void Highlighter::highlightBlock(const QString &text)    //应用高亮规则,也用于区块的高亮,比如多行注释
 92 {
 93     foreach (const HighlightingRule &rule, highlightingRules) {    //文本采用高亮规则
 94         QRegExp expression(rule.pattern);
 95         int index = expression.indexIn(text);
 96         while (index >= 0) {
 97             int length = expression.matchedLength();
 98             setFormat(index, length, rule.format);
 99             index = expression.indexIn(text, index + length);
100         }
101     }
102
103     setCurrentBlockState(0);        //以下是多行注释的匹配
104
105     int startIndex = 0;
106     if (previousBlockState() != 1)
107         startIndex = commentStartExpression.indexIn(text);
108
109     while (startIndex >= 0) {
110         int endIndex = commentEndExpression.indexIn(text, startIndex);
111         int commentLength;
112         if (endIndex == -1) {
113             setCurrentBlockState(1);
114             commentLength = text.length() - startIndex;
115         } else {
116             commentLength = endIndex - startIndex
117                             + commentEndExpression.matchedLength();
118         }
119         setFormat(startIndex, commentLength, multiLineCommentFormat);
120         startIndex = commentStartExpression.indexIn(text, startIndex + commentLength);
121     }
122 }
123 //used in editor
124 void MainWindow::setupEditor()
125 {
126     QFont font;
127     font.setFamily("Courier");
128     font.setFixedPitch(true);
129     font.setPointSize(10);
130
131     editor = new QTextEdit;
132     editor->setFont(font);
133
134     highlighter = new Highlighter(editor->document());   //调用方法,新建对象并传递document
135
136     QFile file("mainwindow.h");
137     if (file.open(QFile::ReadOnly | QFile::Text))
138         editor->setPlainText(file.readAll());
139 }

效果:

时间: 2024-10-16 19:21:04

Qt的语法高亮类(注释方式)的相关文章

eclipse *.vm 文件,语法高亮

eclipse *.vm 文件,语法高亮按如下方式不起作用,原因不明.设置文件打开时使用的编辑器General>>Editors>>File Associations 下述方试可以:General>>Content Types,选择Text>>Html,点击Add,输入*.vm,保存. (直接这一步即可)

12款最佳的 WordPress 语法高亮插件推荐

语法高亮工具增强了代码的可读性,美化了代码,让程序员更容易维护.语法高亮提供各种方式由以提高可读性和文本语境,尤其是对于其中可以结束跨越多个页面的代码,以及让开发者自己的程序中查找错误.在这篇文章中,我们选择了12款最佳的 WordPress 语法高亮插件分享给大家,这将有助于你管理,美化和突出你的代码. 您可能感兴趣的相关文章 10大流行的 Metro UI 风格 Bootstrap 主题 推荐35款精致的 CSS3 和 HTML5 网页模板 10款最新流行的 jQuery 插件,值得你收藏

ABAP开发环境语法高亮的那些事儿

关于SAP ABAP开发环境,Jerry之前写过几篇公众号文章: 那些年我用过的SAP IDE 不喜欢SAP GUI?那试试用Eclipse进行ABAP开发吧 使用Visual Studio Code编写和激活ABAP代码 本文从另一个角度出发,单独聊聊ABAP开发环境里的语法高亮话题. 俗话说,佛靠金装,人靠衣装.咱们程序员虽然平日上班都穿千篇一律的职业装: 程序员专用的格子伞: Jerry衣柜里最不缺这种衣服: 但幸好我们的开发环境还是能够进行各种个性化设置,所以虽然大家都穿着一样的格子衫,

js 正则练习之语法高亮

原文:js 正则练习之语法高亮 学了几天正则,差不多该总结整理写成果了,之前就想写语法高亮匹配来着,不过水平不够,看着例子都不理解.今天就分析下 次碳酸钴 和 Barret Lee 语法高亮实现. 先说 Barret Lee 的这篇 <玩转正则之highlight高亮>之前看的时候只觉的神奇,特别是下面那个一步一步分开匹配的例子,更是霸气测漏,不过作者也说了,分开只是为了演示方便,可以很直观的看到这一步匹配了什么,不然一步到位匹配完成,你都不知道发生了什么就处理完毕了.来看下他的正则 (/^\

EditPlus远程编辑、语法高亮、编译运行源代码设置

最近写代码的过程中,除了写Java时用的Eclipse.在Linux下编辑的Vi之外,有时也会用EditPlus打开一些文件,如配置文件.日志文件.脚本等.个人觉得EditPlus在很多场景下比较好用,也很轻量,其中有一些有用的功能简单总结了一下. 1.远程编辑 通过Sftp编辑远程文件,除了用SftpDrive直接把服务器文件系统映射成本地磁盘外,还可以利用EditPlus自身支持的FTP功能.从编码的角度,后者更方便些,设置好后,每次需要编辑时,不必打开SftpDrive.从“计算机”中打开

ABAP的语法高亮是如何在浏览器里显示的

这篇文章的原文我发表在SAP官方社区上:https://blogs.sap.com/2018/03/09/how-abap-syntax-highlight-is-implemented-in-webide-launched-via-browser/ 在S/4HANA里,我们现在能在浏览器里写ABAP了,并且支持语法高亮. 你也许会问,ABAP的语法高亮是如何在浏览器里显示的?下面跟我一起来通过调试的方式自己找到问题的答案. (1). 在浏览器里敲个ABAP的关键字,比如data.发现被高亮了.

我是如何给discuz模板做语法高亮的

本人一直做ASP.NET开发,近期接到任务要用Discuz开发一个社区,第一次接触PHP,PHP灵活的语法,天生的模块化,各种语法糖深深的震惊了我,我从内心深处感受到了PHP是最牛逼的语言!!! 好了回到正题,初次看Discuz的模板,用VS打开是这样的: 没错,第一眼看上去就震惊了,这TM怎么维护?模板随随便便就2000行,因为DZ是一个极灵活的论坛,里面放了各种hook点用于扩展功能!所以模板非常庞大复杂. DZ的模板语法采用了HTML注释扩展(有一部分内联的却是破坏性的),见: http:

github atom创建自己的语法高亮

使用atom一段时间了,有些插件还不是很成熟.比如项目中使用protobuf,早就有人写了语法高亮(https://github.com/podgib/atom-protobuf),但是效果不是很好.于是决定自己写一个. atom linux的配置目录在~/.atom下,里面有一个packages目录,所有安装的插件(或者叫做包)都在这里.所有在这里的包在启动时都会自动加载.因此,我们直接在这里创建一个包. cd .atom/packages mkdir language-protobufcd

vim显示行号、语法高亮、自动缩进的设置

在UBUNTU中vim的配置文件存放在/etc/vim目录中,配置文件名为vimrc 在Fedora中vim的配置文件存放在/etc目录中,配置文件名为vimrc 在Red Hat Linux 中vim的配置文件存放在/etc目录中,配置文件名为vimrc set nocompatible                 "去掉有关vi一致性模式,避免以前版本的bug和局限     set nu!                                    "显示行号 set