仅仅当作普通编辑器
这个编辑器QsciScintilla类,自己有 字体、背景色设置函数,比如
setFont(QFont xx) //设置字体
setColor(QColor xx) //设置前景色
setPaper(QColor xx) //设置背景色
setCaretLineBackgroundColor(bgColor); //设置光标行背景色
setSelectionBackgroundColor(bgColor); //设置选中行背景色
setEdgeColor(fgColor); //设置代码边沿颜色,代码最优变得代码限制列线
setFoldMarginColors(fgColor, bgColor); //设置折叠margin栏的颜色
setWhitespaceForegroundColor(fgColor); //设置空格的背景色
setWhitespaceBackgroundColor(paper()); //设置空格的前景色
上述是未安装词法分析器的情况,此时所有的字符串都没有含义,都是当作一样的来对待,所以上述的函数会将整个编辑器里的内容的字体,背景色等都修改了。
安装上了词法分析器
但是如果我们给它安装上一个词法分析器后,比如如下代码:
QsciLexer *textLexer; textLexer = new QsciLexerCPP; ui->editor->setLexer(textLexer);
那么上面的 setFont(QFont xx) ,setColor(QColor xx),setPaper(QColor xx) 这几个函数就失效了,因为词法分析器会自己去控制每个词法单元(比如注释,关键字,api,括号等都是单独的不同的词法单元)的字体,颜色,背景色等属性。
那么显然,我们就要通过此法分析器这个途径去设置对应的颜色才可以到达目的了。
原理
此时的词法单元的属性设置的原理如下:
词法分析器会将源码中的字符串分成一个个类型单位WordsStyle(词法单元),且给一个 ID(基本上都有对应的枚举类型与之对应的),比如 QsciLexerCPP 分析器就 包括如下:
- Comment ,ID=1,表示注释,对应的枚举为 QsciLexerCPP::Comment
- Number ,ID=4,表示数字,对应的枚举为 QsciLexerCPP::Number
- Keyword ,ID=5,表示关键字,对应的枚举为 QsciLexerCPP::Keyword
- Identifier ,ID=11,表示标识符,对应的枚举为 QsciLexerCPP::Identifier
- ……更多的自己看头文件去吧,注:ID=0 表示默认值,关于默认值的作用,请看下文。
我们通过QsciStyle来操控这些WordsStyle,从而实现对每一项进行对应设置,
QsciStyle包含如下3个设置项:
- 颜色,这个可以分为:
1. 前景色 QColor &color
2. 背景色 QColor &paper - 字体 QFont &font (字体包含几个常见属性,见附录)
设置过程
QsciStyle设置的过程如下:
QFont f("Wide Latin", 20, QFont::Normal); //创建一个字体:字体名,字体大小,字体样式
QColor cc(Qt:: red); //创建一个红色颜色
QColor cb(Qt:: yellow) //创建一个黄色颜色
QsciStyle style(1); //为Comment注释创建一个style对象
style.setFont(f); //设置字体
style.setColor(cc); //设置前景色
style.setPaper(cb); //设置背景色
style.apply(ui->editor); //将该style应用到编辑器中
此时,编辑器中,所有的注释,都会变成预期效果了。
注意:如果style对象没有设置这3项(前景色,背景色,字体)中的某一项,那么编辑器将会采用默认值来填充该style。而该默认值是可以设置的,采用QsciLexer的如下函数:
void setDefaultColor(const QColor &c); void setDefaultPaper(const QColor &c); void setDefaultFont(const QFont &f);
如果我们不想创建QsciStyle,想直接设置,行不行呢,也可以的,通过QsciLexer的如下槽函数(因为上面的style的apply函数应该就是发射了一个信号给QsciLexer来触发这些槽函数了):
virtual void setColor(const QColor &c,int style = -1); virtual void setPaper(const QColor &c,int style = -1); virtual void setFont(const QFont &f,int style = -1);
通过指定ID号即可,跟上面是一样的方式。但是,如果我们不填这个ID号(也就是-1),那么就是所有的ID号的WordsStyle都会得到设置,这个特性很有用,比如我想为所有的词法单元都设为同一种字体,或者同一种背景色啥的,那么这个就很快捷。
所以,如果我们想要制作一个编辑器的配色文件,那么就做一个xml文件(或者json等)如下格式就行:
<WordsStyle name="COMMENT" styleID="1" fgColor="1E9AE0" bgColor="2A211C" fontName="" fontStyle="0" fontSize="10" /> <WordsStyle name="Keyword" styleID="1" fgColor="1E9AE0" bgColor="2A211C" fontName="" fontStyle="0" fontSize="10" />
。。。
附录
字体描述
一种字体的属性常用的包括3项(当然还有其它的):
- 字体名fontName:比如 Consola,微软雅黑等
- 字体大小fontSize:比如 9
- 字体样式fontStyle:这个常用的包含4个:
正常体 Nomal
粗体 Bold
斜体 Italic
下划线 Underline