首页 > 技术文章 > QScintilla入门指南之基本介绍

ain1 2022-03-12 00:04 原文

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-bitDebug方式进行构建。构建的目的就是生成我们需要的库文件。编译完成后,在Debug目录下,会生成我们需要的库文件,即qscintilla2_qt5d.dll

1.3 创建项目

为了后续章节的代码实现,这里则不使用库中所提供的example-Qt4Qt5/application.pro,该项目什么都没有实现。为此,这里我们新建一个项目。

项目建好之后,将之前编译的动态库文件qscintilla2_qt5d.dll以及Qt4Qt5目录下的Qsci文件夹拷贝到我们的工程目录下:

image

然后打开.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。


其余该系列文章如下:

  1. QScintilla入门指南之 编辑器设置
  2. QScintilla入门指南之 边界栏
  3. QScintilla入门指南之 词法分析器(正在更新...)
  4. QScintilla入门指南之 可点击文本(正在更新...)
  5. QScintilla入门指南之 自动补全(正在更新...)

推荐阅读