QScintilla入门指南之基本介绍
Scintilla是一个免费、跨平台、支持语法高亮的编辑控件。它完整支持源代码的编辑和调试,包括语法高亮、错误指示、自动补全(code completion)和函数提示(call tips)。能包含标记(marker)的页边(margin)可用于标记断点、折叠和高亮当前行。而QScintilla是Scintilla在QT上的移植。使用该库可以更为方便的开发Qt程序。
由于国内网站对于该库的说明文档比较缺少,所以本文主要参考自外网文档QScintilla。但是该网站使用的是Python语言,而本文使用的是C++语言,如果读者需要寻找Python语言的使用方法,可以去浏览该网站。除此之外,本文也参考了QScintilla库的相关开发文档。如有错误,还请指出。
一、下载和编译
1.1 下载
官网下载地址:Riverbank Computing | Download
注意:有多个版本,而2.12及其以后的版本,不再支持Qt4和Qt5了,所以源码中没有QT4QT5
这个目录了。这里我下载的是2.11.3
这个版本。这里我使用的QT版本是 Qt 5.14.2。下载完成后解压,其目录结构如下:
目录名 | 用途 |
---|---|
Qt4Qt5 | 编译文件夹,生成对应的DLL文件 |
designer-Qt4Qt5 | 相关的设计师插件的编译文件夹 |
example-Qt4Qt5 | 简单的示例文件夹 |
doc | 使用Doxygen生成的帮助文档 |
lexers | 已实现的各语法分析器 |
... | ... |
对于相关的 Qt Designer 控件的编译,可以去浏览该网站:QScintilla的安装及简介。
1.2 编译
打开Qt4Qt5文件夹,找到qscintilla.pro,双击打开,构建即可。这里我使用的是MinGW 32-bit及Debug方式进行构建。构建的目的就是生成我们需要的库文件。编译完成后,在Debug目录下,会生成我们需要的库文件,即qscintilla2_qt5d.dll
。
1.3 创建项目
为了后续章节的代码实现,这里则不使用库中所提供的example-Qt4Qt5/application.pro
,该项目什么都没有实现。为此,这里我们新建一个项目。
项目建好之后,将之前编译的动态库文件qscintilla2_qt5d.dll
以及Qt4Qt5目录下的Qsci
文件夹拷贝到我们的工程目录下:
然后打开.pro
文件,添加如下代码:
INCLUDEPATH += $$PWD/Qsci
LIBS += -L$$PWD -lqscintilla2_qt5d
二、类层次结构
2.1 QSciScintillaBase和QSciScintilla
最基本的类就是QSciScintillaBase
,它是⽂本编辑器的基类,如下图所示,它继承于QAbstractScrollArea
。
但是 QSciScintillBase 类不是直接使⽤的类,它很低级,因此很难使⽤。QScintilla 库提供了⼀个⾼级⼦类:QSciScintlla
。它就是⽂本编辑器类,其内有许多类似于 Qt 的 API 。 如果该类缺少所需的某些⾮常具体的功能,此时可以继承其⽗类 QSciScintillaBase。
2.2 创建编辑器
向之前创建的项目中添加编辑器:
MainWindow.h 如下:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
class QsciScintilla;
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
QsciScintilla* editor;
};
#endif // MAINWINDOW_H
MainWindow.cpp 如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <Qsci/qsciscintilla.h>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
editor = new QsciScintilla(this);
setCentralWidget(editor);
}
MainWindow::~MainWindow()
{
delete ui;
}
编译运行结果如下:
该编辑器本身就含有撤销、回撤、剪切、复制、粘贴、删除、全选操作。右键可以呼出编辑菜单。
按住 Ctrl 键,滚动鼠标滚轮,可以 放大/缩小 编辑器字体。
2.3 QSciLexer
语法高亮显示的对象称之为词法分析器
。创建并配置这样的词法分析器对象后,只需要将其应用到⽂本编辑器(QSciScintilla对象)中即可。关于词法分析器的实现,QScintilla 提供了QSciLexer
类,该类是⼀个抽象类,因此在创建对象之前,需要对其进行子类化。
2.4 QSciAPI
⼀个好的⽂本编辑器提供的不仅仅是需要语法的高亮显示,还需要有函数参数提示和自动补全等功能。这些功能都存在于QSciAPI
类中。只需要从该类创建⼀个实例,并将其应用到 QSciLexer 对象中即可。而其父类是一个抽象类,类名为QSciAbstractAPIs
。
三、其他类
QsciPrinter
:继承自QPrinter
,能够打印 Scintilla 文档文本的类。QsciCommand
:内部编辑器命令,其中可能绑定了一个或两个键。QsciCommandSet
:可能绑定了键的所有内部编辑器命令的集合。QsciDocument
:要编辑的文档。QsciStyle
:封装样式的所有属性。QsciStyledText
:一段文本的容器和用于显示文本的样式。
除此之外,还有大量的继承自QsciLexer
类的特定语言类,目前支持的语言有:AVS、Bash、批处理、CMake、CoffeeScript、C++、C#、IDL、Java、JavaScript、CSS、D、Diff、Fortran77、Fortran、HTML、XML、JSON、Lua、Makefile、Markdown、Matlab、Octave、Pascal、Perl、PO、PostScript、POV、Properties、Python、Ruby、Spice、SQL、TCL、TeX、Verilog、VHDL、YAML、Macro。
其余该系列文章如下: