QScintilla

QScintilla是对Scintilla的一个Qt端接口，由英国软件公司Riverbank Computing编写，它是一面向Qt公司的Qt图形使用者界面框架的源始码编辑器组件之一。由于采用了尼尔·霍奇森（英语：Neil Hodgson）用C++写成的Scintilla组件，QScintilla的内核和基本逻辑均由C++实现。QScintilla封装了几乎所有的Scintilla功能；官方解释称“QScintilla中，除了能找到普通文本编辑器的所有功能外，QScintilla还包含了有助快速编写代码和为程式除错的功能，包括语法突显、错误指示符、自动完成和呼叫提示等等。用作选择的页边可有标注，这对于除错器想要标识中断点和当前行很有用。渲染选项比市面上很多源代码编辑器还要多，QScintilla支持比例字形字体、粗体和斜体、多重前景色彩和背景色彩、多重字体等等。”

从理论上来讲，QScintilla是一个以C++编写的自由开源程式库。由于QScintilla也提供了面向Python的组件（用户可以搭配版本5或6的PyQt使用它，也可以在PyPI上下载使用），所以QScintilla也可以被视作一Python程式库。

## 功能

除了以上官方所述的语法突显、错误指示符、自动完成和呼叫提示等以外，QScintilla由于继承了Scintilla的实现与逻辑，它配备了以下的源代码编辑器功能：

- 语法折叠
- 自定义以及可录影的宏（宏）
- 多重文件界面
- 文档打印

由于QScintilla的使用者界面部分基于Qt，因此QScintilla可在任何Qt所支持的平台上运作，如Windows、Linux、macOS、iOS和Android等。

目前QScintilla的底层逻辑基于Scintilla 3.10.1版本，因此QScintilla可能缺失部分或全部Scintilla在其3.10.1后的版本所实现的功能（如`SCI_GETSTYLEDTEXTFULL`等，不在`QsciScintillaBase`类的匿名枚举中）。

## 许可证与法律地位

与Scintilla不同，QScintilla使用的是与PyQt（和早期Qt）相同的许可证标准。行双轨许可证：GNU GPL第三版本和PyQt自己的商业许可（目前PyQt和QScintilla均不提供LGPL及其他任何的自由软件许可证，因为官方声称不确定这样做能否维持其售卖商业许可证的收入）。开发自由软件者、开源软件以及任何非牟利的软件可使用免费的许可证，但任何牟利性的、商业性的软件都必须购买PyQt商业许可证才合法。

如果买家买了PyQt商业许可证，那么其许可证就是终身有效的，使用者可以自由地下载及商业地使用当前和及后版本的PyQt和QScintilla等。但该许可证并不包含购买时间前所发布的版本。PyQt的商业许可证并不包含Qt的商业许可证；使用者需另外购买。

Riverbank Computing公司不单独出售QScintilla的许可证；相反，商业使用者必须购买所有的Riverbank Computing产品，包括PyQt、PyQt `3D`、PyQt `Charts`、`SIP`及QScintilla等。换言之，QScintilla是随着PyQt衍生而来的产品。

## 范例

右侧的图片为两个范例运行的结果，在GNU/Linux的Ubuntu上编译/运行（用Python和C++编写后运行的结果均为一样）。

<image>

此处为一个使用Python编写的范例：

```python3
#!/usr/bin/python3
# -*- encoding: utf8 -*-

from PyQt5.QtWidgets import QApplication, QMainWindow
# 從PyQt的QtWidgets子模組中導入依賴類，使用版本爲5
from PyQt5.Qsci import QsciLexerCPP, QsciScintilla
# 從QScintilla導入編輯器及C++詞法分析器類，使用PyQt版本爲5
# 需事先透過「pip install QScintilla」下載

import sys
# 導入sys模塊

# 運行主代碼
if __name__ == "__main__":
    app: QApplication = QApplication(sys.argv)
    # 建立一個QApplication實例
    mw: QMainWindow = QMainWindow()
    # 建立一個QMainWindow實例
    ed: QsciScintilla = QsciScintilla(mw)
    # 建立編輯器實例，父類爲mw
    lex: QsciLexerCPP = QsciLexerCPP(ed)
    # 建立詞法分析器實例，父類爲ed
    ed.setLexer(lex)
    # 設定分析器
    ed.setMarginLineNumbers(0, True)
    # 設定行號
    ed.setMarginWidth(0, "000000")
    # 設定顯示行號的頁邊界所佔寬度爲六個字符
    mw.setCentralWidget(ed)
    # 常規操作
    mw.show()
    # 顯示mw
    sys.exit(app.exec())
    # 常規操作，也可調用app.exec_()
```

以下为C++版本：

```c++
#include <QApplication>
#include <QMainWindow>
// 從PyQt的QtWidgets子模組中導入依賴類，使用版本自由
#include <Qsci/qscilexercpp.h>
#include <Qsci/qsciscintilla.h>
// 從QScintilla導入編輯器及C++詞法分析器類，使用Qt版本自由
// 需事先透過「Qt Online Installer」下載、編譯、封裝Qt
// 然後再從GitHub或Riverbank的官網上下載QScintilla，解壓壓縮包。
// 編譯、下載。
// 需要用到CMake/QMake。

// 運行主代碼
int main(int argc, char *argv[]) {
    QApplication app(argc, argv)
    // 建立一個QApplication實例
    QMainWindow mw()
    // 建立一個QMainWindow實例
    QsciScintilla *ed = new QsciScintilla(&mw)
    // 建立編輯器實例，父類爲mw指針地址
    QsciLexerCPP *lex = new QsciLexerCPP(ed)
    // 建立詞法分析器實例，父類爲ed
    ed->setLexer(lex)
    // 設定分析器
    ed->setMarginLineNumbers(0, true)
    // 設定行號
    ed->setMarginWidth(0, "000000")
    // 設定顯示行號的頁邊界所佔寬度爲六個字符
    mw.setCentralWidget(ed)
    // 常規操作
    mw.show()
    // 顯示mw
    return app.exec()
    // 常規操作，也可調用app.exec_()
}
```

## 基本资料

- 日语原文：PAGENAME
- 说明：QScintilla C++ Lexer Example
- 作者：Neil Hodgson等人
- 开发者：Riverbank Computing公司
- 发行日期：2006年6月17日
- 软件版本周期：2.14.1（2023年6月23日）
- 编程语言：C++、Python
- 操作系统：Microsoft Windows、MacOS、Linux、Android、iOS等
- 平台：所有Qt支持的平台，如x86及x86-64等
- 语言：捷克语、德语、西班牙语、法语、葡萄牙语（巴西）及英语
- 语言：6
- 许可协议：GNU GPL及PyQt商业许可证
- 源代码库：https://github.com/brCreate/QScintilla
- 网站：https://riverbankcomputing.com/software/qscintilla/intro