QScintilla
此條目過於依赖第一手来源。 (2024年8月21日) |
QScintilla是對Scintilla的一個Qt端接口,由英國軟件公司Riverbank Computing編寫,它是一面向Qt公司的Qt圖形使用者界面框架的源始碼編輯器組件之一[1]。由於採用了尼爾·霍奇森(英语:Neil Hodgson)用C++寫成的Scintilla組件,QScintilla的內核和基本邏輯均由C++實現[2]。QScintilla封裝了幾乎所有的Scintilla功能;官方解釋稱「QScintilla中,除了能找到普通文本編輯器的所有功能外,QScintilla還包含了有助快速編寫代碼和爲程式除錯的功能,包括語法突顯、錯誤指示符、自動完成和呼叫提示等等。用作選擇的頁邊可有標註,這對於除錯器想要標識中斷點和當前行很有用。渲染選項比市面上很多源代碼編輯器還要多,QScintilla支持比例字形字體、粗體和斜體、多重前景色彩和背景色彩、多重字體等等。」[3][4]
原作者 | Neil Hodgson等人 |
---|---|
開發者 | Riverbank Computing公司 |
首次发布 | 2006年6月17日 |
当前版本 | 2.14.1(2023年6月23日) |
源代码库 | https://github.com/brCreate/QScintilla |
编程语言 | C++、Python |
操作系统 | Microsoft Windows、MacOS、Linux、Android、iOS等 |
平台 | 所有Qt支持的平臺,如x86及x86-64等 |
语言 | 6种语言 |
许可协议 | GNU GPL及PyQt商業許可證 |
网站 | https://riverbankcomputing.com/software/qscintilla/intro |
從理論上來講,QScintilla是一個以C++編寫的自由開源程式庫。由於QScintilla也提供了面向Python的組件(用戶可以搭配版本5或6的PyQt使用它[5],也可以在PyPI上下載使用[6]),所以QScintilla也可以被視作一Python程式庫[3]。
功能
编辑除了以上官方所述的語法突顯、錯誤指示符、自動完成和呼叫提示等以外,QScintilla由於繼承了Scintilla的實現與邏輯,它配備了以下的源代碼編輯器功能[7]:
由於QScintilla的使用者界面部分基於Qt,因此QScintilla可在任何Qt所支持的平臺上運作[7],如Windows、Linux、macOS、iOS和Android等。
目前QScintilla的底層邏輯基於Scintilla 3.10.1版本[7],因此QScintilla可能缺失部分或全部Scintilla在其3.10.1後的版本所實現的功能(如SCI_GETSTYLEDTEXTFULL
等,不在QsciScintillaBase
類的匿名枚舉中)[8][9][10]。
許可證與法律地位
编辑與Scintilla不同,QScintilla使用的是與PyQt(和早期Qt)相同的許可證標準。行雙軌許可證:GNU GPL第三版本和PyQt自己的商業許可(目前PyQt和QScintilla均不提供LGPL及其他任何的自由軟體許可證,因爲官方聲稱不確定這樣做能否維持其售賣商業許可證的收入[11])。開發自由軟體者、開源軟體以及任何非牟利的軟體可使用免費的許可證,但任何牟利性的、商業性的軟體都必須購買PyQt商業許可證才合法[12]。
如果買家買了PyQt商業許可證,那麼其許可證就是終身有效的,使用者可以自由地下載及商業地使用當前和及後版本的PyQt和QScintilla等。但該許可證並不包含購買時間前所發佈的版本。PyQt的商業許可證並不包含Qt的商業許可證;使用者需另外購買。[13]
Riverbank Computing公司不單獨出售QScintilla的許可證;相反,商業使用者必須購買所有的Riverbank Computing產品,包括PyQt、PyQt 3D
、PyQt Charts
、SIP
及QScintilla等[14]。換言之,QScintilla是隨着PyQt衍生而來的產品。
組件
编辑QsciAbstractAPIs
和QsciAPIs
提供了調用提示和自動完成的純文本API資料[15]。QsciCommand
和QsciCommandSet
提供了一系列QsciScintilla
所用到的命令,以及其對應的鍵盤快捷鍵[16][17]。QsciDocument
表達了一份正在編輯的文件,以便使用QScintilla開發的編輯器調用並進行多文件編輯[18]。QsciLexer*
定義了詞法分析器。QScintilla中的詞法分析器雖然不會像一門真正面世的編程語言般產生標識符列表供語法分析器分析,但仍包含面對特定語言的功能,如語法高亮、自動完成、錯誤提示、調用提示等等[19]。截至2.14.1版本,QScintilla包含面向以下編程語言的功能:ASM[20]、AVS[21]、Bash[22]、Batch[23]、CMake[24]、CoffeeScript[25]、C++[26]、C♯[27]、CSS[28]、D[29]、Diff文檔[30]、EDIFACT(支援不足)[31]、Fortran[32]、Fortran 77[33]、Hex[34]、HTML[35]、IDL[36]、IntelHex[37]、Java[38]、JavaScript[39]、JSON[40]、Lua[41]、Makefile[42]、Markdown[43]、MASM[44]、Matlab[45]、NASM[46]、Octave[47]、Pascal[48]、Perl[49]、PO[50]、PostScript[51]、POV[52]、INI文檔[53]、Python 2[54]、Ruby[55]、Spice[56]、SQL[57]、S-Record[58]、TCL[59]、Tektronix Hex[60]、TeX[61]、Verilog[62]、VHDL[63]、XML[64]、YAML[65]。用戶可以繼承以上任何分析器類來更改其默認顏色、背景色、字體、關鍵字等,以自定顯示樣式和語言關鍵字,來讓編輯器支持QScintilla默認沒有的,但與父類相似的編程語言。例如:繼承QsciLexerCPP
並重寫其受保護方法keywords(int style);
來使它實際上變爲C語言的分析器(C++的語法與C相似)[66];重寫QsciLexerPython::keywords(int style);
使它事實上支援Python 3(在QScintilla的層面下,Python 2和Python 3除關鍵字外無異)[67];諸如Java、JavaScript及IDL等也是如此實現的[68][69][70][71]。除此之外,還可以透過繼承QsciLexerCustom
來進行底層代碼掃描和代碼摺疊[72]來定義一個全新的分析器。QsciMacro
定義了一系列可快速錄製/回放巨集/宏的工具[73]。QsciPrinter
繼承了QPrinter
[74],令使用者打印一份QScintilla的文檔時可操控其特有的頁面屬性,如縮放度[75]、打印特定行號[76]、自動換行[77]等。QsciScintilla
是QScintilla面向最終程序員的唯一小部件(繼承自QWidget
)。是一個功能完備的源代碼編輯器,是QScintilla庫的核心元件。官方稱,「QsciScintilla提供了一個更高階的、更向Qt的Scintilla API」[78]。QsciScintillaBase
則是實現Scintilla的底層邏輯和代碼,正常來說一般用戶並不會直接用到它(而且QsciScintilla
繼承QsciScintillaBase
)。後者充其量也就是一個枚舉提供類(Scintilla稱爲「信息」),並且透過SendScintilla(unsigned long msg, ...);
方法提供一個底層的信息交互實現。QsciStyle
和QsciStyledText
是QScintilla自行的樣式和受渲染文字的容器。它們可在某些需要設定文字外觀的方法中,設置被顯示文字的格式,而非系統的預設格式[79][80]。舉例:QsciScintilla::annotate(...);
。
範例
编辑右側的圖片爲兩個範例運行的結果,在GNU/Linux的Ubuntu上編譯/運行(用Python和C++編寫後運行的結果均爲一樣)。
此處爲一個使用Python編寫的範例:
#!/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++版本:
#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_()
}
參考資料
编辑- ^ QScintilla: QScintilla - a Port to Qt v5 and Qt v6 of Scintilla. brdocumentation.github.io. [2024-08-19].
- ^ brCreate, brCreate/QScintilla, 2024-08-02 [2024-08-18]
- ^ 3.0 3.1 Riverbank Computing | Introduction. riverbankcomputing.com. [2024-08-18].
- ^ Riverbank Computing | Introduction. riverbankcomputing.com. [2024-08-19].
- ^ QScintilla/Python at main · brCreate/QScintilla. GitHub. [2024-08-18] (英语).
- ^ Limited, Riverbank Computing, QScintilla: Python bindings for the QScintilla programmers editor widget, [2024-08-18]
- ^ 7.0 7.1 7.2 QScintilla: QScintilla - a Port to Qt v5 and Qt v6 of Scintilla. brdocumentation.github.io. [2024-08-19].
- ^ Scintilla Documentation. scintilla.org. [2024-08-19].
- ^ Scintilla Documentation. scintilla.org. [2024-08-19].
- ^ QScintilla: QsciScintillaBase Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ Riverbank Computing | License FAQ. riverbankcomputing.com. [2024-08-19].
- ^ Riverbank Computing | Buy PyQt. riverbankcomputing.com. [2024-08-19].
- ^ Riverbank Computing | Buy PyQt. riverbankcomputing.com. [2024-08-19].
- ^ Riverbank Computing | Buy PyQt. riverbankcomputing.com. [2024-08-19].
- ^ QScintilla: QsciAPIs Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciCommand Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciCommandSet Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciDocument Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexer Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerAsm Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerAVS Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerBash Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerBatch Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerCMake Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerCoffeeScript Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerCPP Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerCSharp Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerCSS Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerD Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerDiff Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerEDIFACT Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerFortran Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerFortran77 Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerHex Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerHTML Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerIDL Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerIntelHex Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerJava Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerJavaScript Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerJSON Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerLua Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerMakefile Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerMarkdown Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerMASM Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerMatlab Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerNASM Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerOctave Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerPascal Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerPerl Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerPO Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerPostScript Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerPOV Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerProperties Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerPython Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerRuby Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerSpice Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerSQL Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerSRec Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerTCL Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerTekHex Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerTeX Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerVerilog Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerVHDL Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerXML Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerYAML Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerCPP Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciLexerPython Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: Class Hierarchy. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla/src/qscilexerjava.cpp at main · brCreate/QScintilla. GitHub. [2024-08-19] (英语).
- ^ QScintilla/src/qscilexerjavascript.cpp at main · brCreate/QScintilla. GitHub. [2024-08-19] (英语).
- ^ QScintilla/src/qscilexeridl.cpp at main · brCreate/QScintilla. GitHub. [2024-08-19] (英语).
- ^ How do you add folding to QsciLexerCustom subclass?. Stack Overflow. [2024-08-19] (英语).
- ^ QScintilla: QsciMacro Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciPrinter Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciPrinter Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciPrinter Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciPrinter Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciScintilla Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciStyle Class Reference. brdocumentation.github.io. [2024-08-19].
- ^ QScintilla: QsciStyledText Class Reference. brdocumentation.github.io. [2024-08-19].