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