背景
Qscitinlla介绍
Qscitinlla的前身是Scintilla,一个非常强大的文本编辑器控件,我们常用的Notepad++就是基于这个库开发的,官网:http://www.scintilla.org,Qscitinlla是用在Qt开发平台上的Scintilla的移植版本。
Qscitinlla配置
Qscitinlla下载地址: https://riverbankcomputing.com/software/qscintilla/download
根据平台下载后解压,进入Qt4Qt5目录,用QtCreator打开qscintilla.pro,构建项目,稍等片刻,编译完成,会在解压目录下的build-qscintilla-Desktop_Qt****/release生成qscintilla2.lib或者qscintilla2.a文件,这主要是取决于你用什么编译器。然后创建一个Qt桌面应用,将刚才生成的静态链接库导入到工程中,并将解压目录下的Qt4Qt5中的Qsci目录拷贝到新创建的工程目录下。到这,Qscitinlla就配置好了。
Qscitinlla的使用
QsciScintilla是QWidget的非直接子类,所以,它也是个控件。在使用之前,要引入QsciScintilla控件的头文件
#include <Qsci/qsciscintilla.h>
1.创建一个QsciScintilla实例并填满主窗口
-
QsciScintilla *editor=
new QsciScintilla(
this);
-
setCentralWidget(editor);
这样,一个文本编辑器控件创建好了。
2.实现代码高亮
QsciScintilla自带有多种语言的词法分析器,所以它支持多种语言的代码高亮,在这里,我们使用Lua语言的词法分析器来做例子,首先,引入Lua词法分析器类的头文件#include <Qsci/qscilexerlua.h>,然后给QsciScintilla设置词法分析器。
-
QsciLexerLua *textLexer =
new QsciLexerLua;
//创建一个词法分析器
-
editor->setLexer(textLexer);
//给QsciScintilla设置词法分析器
3.显示行号
QsciScintilla左边可显示页边(Margins)和标记(Markers)。
页边是位于文本显示区左边的一竖条区域,它可以用于显示行号、书签、断点标记等, Scintilla最多可以有5个页边(从左到右的编号为0~4)。
标记是用于标记文本的位置。(参考:http://www.cnblogs.com/superanyi/archive/2011/04/07/2008636.html)
那我们如何显示行号呢,看下面的代码:
-
editor->setMarginType(
0,QsciScintilla::NumberMargin);
//设置编号为0的页边显示行号。
-
editor->setMarginLineNumbers(
0,
true);
//对该页边启用行号
-
editor->setMarginWidth(
0,
50);
//设置页边宽度
4.实现代码提示
代码提示功能依靠QsciAPIs类实现,QsciAPI类定义在Qsci/qsciapis.h中,如果你要提示的词不多,可以使用add方法往添加关键词,添加完后调用prepare方法。
-
QsciAPIs *apis =
new QsciAPIs(textLexer);
-
apis->add(QString(
"local"));
-
apis->prepare();
但是如果你要提示的关键字很多,那就考虑把关键字存到文件,每个关键词为一行,然后调用load方法从文件加载了。
-
QsciAPIs*apis =
new QsciAPIs(textLexer);
-
if(!apis->load(QString(
"D://api.txt")))
-
QMessageBox::warning(this,QString(
"提示"),QString(
"读取文件失败"));
-
else
-
apis->prepare();
还可以对代码提示配置其他选项。
-
editor->setAutoCompletionSource(QsciScintilla::AcsAll);
//设置源
-
editor->setAutoCompletionCaseSensitivity(
true);
//设置自动补全大小写敏感
-
editor->setAutoCompletionThreshold(
1);
//设置每输入一个字符就会出现自动补全的提示
5.设置字体
editor->setFont(QFont("Courier New"));
6.设置编码
Scintilla默认编码是ANSI ,所以刚开始输入中文字符会出现乱码,我们可以给它设置为UTF-8,这样中文也可以正常显示了
editor->SendScintilla(QsciScintilla::SCI_SETCODEPAGE,QsciScintilla::SC_CP_UTF8);//设置编码为UTF-8
7. SendScintilla函数
SendScintilla是外界与Scintilla交互的通道,通过SendScintilla函数,可以给QScintilla控件发送各种消息来操作它。SendScintilla函数有很多个重载形式。各种可以发送的消息被定义在qsciscintillabase.h这个头文件中。各种消息的用法,请参考QsciScintillaBase类的文档,它位于解压目录的doc下html-Qt4Qt5目录。