[Qt] 自定义语法高亮
编写自定义的语法高亮显示
大多数常见的编程语言都有与之相匹配的IDE(如Visual Sutdio、Eclipse),或者可以语法高亮显示的编辑器(如 UltraEdit,Notepad,Vim)。
但比较少用的或者冷门的编程语言就不一定有对应的语法高亮编辑器,或者说,其自带的编辑器效果很渣渣 ?。
其实大部分语法高亮显示的编辑器(如 UltraEdit,Notepad,Vim)都支持自定义的语法高亮,不过要自己去编写高亮规则。对我而已,总会觉得自己造一个总比从别人那里拿来用更趁手。所以还是自己弄个简单编辑器来试试看吧。
Qt 自带的例子
在 Qt 的帮助中输入“Syntax Highlighter Example”就可以找到官方自带的例子。
在 Qt Creator “欢迎” 的 “示例” 内容中,输入 “Syntax Highlighter Example” 就可以将整个Demo工程加载出来。
官方的说明和Demo工程里面都有非常详细的解答,接下来,就是要做自己需要的语法高亮定义了。
制作NY系列的语法高亮
鉴于我当前的工作是单片机,有些芯片自带的IDE并不怎么理想,加上有很多代码内容无法简略,类似复制黏贴,所以还是自己制作一些小工具简化一些工作内容,配上对应的语法高亮更容易查看结果。
目前用的是NY系列的,所以就弄个NY系列的语法高亮,下面以NY5的Q-Code语法为例子进行处理。
父类 Q-Code 的语法高亮
整个NY语法大致一样,只有部分关键字不同而已,所以就在父类定义相同的方法,留下虚函数设置关键字给子类重写。
自己写的代码有待提高,看到能运行就没进行优化了?,若有宝贵的意见欢迎留言。
创建NY语法高亮父类:NyHighlight
NyHighlight.h
#ifndef NYHIGHLIGHT_H
#define NYHIGHLIGHT_H
#include <QSyntaxHighlighter>
#include <QRegularExpression>
#include <QTextCharFormat>
#include <QStringList>
#include <QVector>
class NyHighlight : public QSyntaxHighlighter
{
Q_OBJECT
public:
NyHighlight(QTextDocument *parent=0);
virtual ~NyHighlight();
virtual void setKeyWord(void) = 0;
virtual void setComment(void);
virtual void setVariable(void);
virtual void setOperator(void);
virtual void setLabel(void);
virtual void setNumber(void);
void appendKeyWordList(QStringList &list, QTextCharFormat &format);
void appendKeyWord(QString pattern, QTextCharFormat &format);
protected:
void highlightBlock(const QString &text) override;
//private:
struct HighlightingRule
{
QRegularExpression pattern;
QTextCharFormat format;
};
QVector<HighlightingRule> highlightingRules;
};
#endif // NYHIGHLIGHT_H
NyHighlight.cpp
#include "nyhighlight.h"
#include <QRegularExpressionMatchIterator>
NyHighlight::NyHighlight(QTextDocument *parent)
: QSyntaxHighlighter(parent)