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。
其余該系列文章如下: