PYQT5:基于QsciScintilla的代码编辑器分析2--搭起骨架(拿来主义)
这里提供本编辑器可执行文件(exe)的下载链接:
1.Code51.Code51_STC
2.百度盘链接::https://pan.baidu.com/s/1Ihxb7WX0ozUuRs3KFyzApQ
提取码:i6my
3.源代码:百度盘链接:https://pan.baidu.com/s/1jlRvWgN2LFHTtnKogeUZZw
提取码:w437
4.源代码的码云链接:https://gitee.com/huangweide001/code4STC51
读者在测试代码时,可以直接运行主文件《texteditor2.py》。
————————————————
辑器由3大部分组成,都是别人的成果,在此向原作者致以崇高的敬意。
- 第一部分:以《PYTHON QT GUI快速编程 PYQT编程指南》(后面简称《PYQT指南》)第9章第5节《多文档界面(MDI)》的例程。
- 第二部分:QsciScintilla,这是编辑器的灵魂。
- 第三部分:跨平台的STC51单片机烧写软件《stcflash.py》。
1.《多文档界面(MDI)》的例程
《PYQT指南》书中讲解相当详细,我再说一遍也没有原版的好,请没有看过的读者请前往阅读。相关代码请看:解决第9章所有实例程序对PyQt5+Python3兼容性问题
但是我还是说说阅读重点:
1.由于要用到小图标,所以要找到自己需要的图片,添加到《images》(名字随便,和资源列表文件中对应即可)文件夹,把图片名字添加到资源列表文件《xxx.prc》,再用程序《pyrcc》将《xxx.prc》转为《xxx.py》,此时方可在python中导入使用。详细方法见《PYQT指南》P129.
2.菜单如何生产。以QMainWindow类为主窗口,此类自带了menuBar,toolBar。生成菜单后向menuBar挂靠就行了。以file菜单为例讲解,先上图:
图中File是由QMainWindow.menuBar().addMenu("&File")生成,图中第1项“example”含有子菜单,它是一个QMenu类,其它项是动作,属于QAction类。看看下面的程序片段:
def createAction(self, text, slot=None, shortcut=None, icon=None,
tip=None, checkable=False, signal="triggered()"):
action = QAction(text, self)
if icon is not None:#设置图标
action.setIcon(QIcon(":/{0}.png".format(icon)))
if shortcut is not None:#设置快捷键
action.setShortcut(shortcut)
if tip is not None:#设置鼠标到达时的提示
action.setToolTip(tip)
action.setStatusTip(tip)
if slot is not None:#关联触发动作
action.triggered.connect(slot)
if checkable: #设置是否可以打钩
action.setCheckable(True)
return action
def addActions(self, target, actions):
for action in actions:
if action is None:#为空就增加分隔行
target.addSeparator()
else:
target.addAction(action)
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
......
#1.生成file下面的各个动作
fileNewAction = self.createAction("&New", self.fileNew,
QKeySequence.New, "filenew", "Create a text file")
fileOpenAction = self.createAction("&Open...", self.fileOpen,
QKeySequence.Open, "fileopen",
"Open an existing text file")
fileSaveAction = self.createAction("&Save", self.fileSave,
QKeySequence.Save, "filesave", "Save the text")
fileSaveAsAction = self.createAction("Save &As...",
self.fileSaveAs, icon="filesaveas",
tip="Save the text using a new filename")
fileSaveAllAction = self.createAction("Save A&ll",
self.fileSaveAll, "filesave",
tip="Save all the files")
fileQuitAction = self.createAction("&Quit", self.close,
"Ctrl+Q", "filequit", "Close the application")
......
#将众多QAtion添加到File上
fileMenu = self.menuBar().addMenu("&File")
self.addActions(fileMenu, (fileNewAction, fileOpenAction,
fileSaveAction, fileSaveAsAction, fileSaveAllAction,
None, fileQuitAction))
工具栏也类似。看代码和书上的解说。
3.多文档容器QMdiArea和QTextEdit如何关联起来,以及其它的编辑动作的实现。也请读者看书。
2.QScintilla控件
QScintilla是Scintilla在QT上的移植,Scintilla是一个免费的源代码编辑控件,它完全开放源代码,功能强大,包括代码高亮,代码补全,代码折叠,自动缩进,代码提示等,支持非常多的语言,可以轻松实现显示断点,显示运行行等,定义各种样式都很轻松方便。著名的开源编辑器SciTE就是Scintilla开发者开发的。据说notepad++,codeblock都是用该控件完成大部分编辑功能的。
我用到的功能仅仅是Scintilla所有功能的冰山一角,真是强大得无法细说。我能力有限,没能好好使用,让我目前无法实现我要的两个功能:【1】鼠标右击编辑区时, 光标跟随;【2】输入完函数名后输入"("时提示函数传参。这两个功能折腾了好几天,最后放弃了,请有心的读者帮我完成。源码分析请看第5章《多文档编辑区介绍》。
3.跨平台的STC51单片机烧写软件《stcflash.py》
先看看这篇博文stcflash跨平台的STC单片机烧写软件的起始段:
STC的官方烧写程序stc-isp虽然很容易使用,但只能在Windows下运行,对于习惯在Linux或者Mac OS上开发的人来说不怎么方便。跨平台的STC单片机烧写软件stcflash就是为有这样需求的开发人员设计。stcflash使用命令行方式操作,用法很简单,可以容易的集成到开发工具链里。<
我就是受这个软件的影响,先把它界面化,后来又想到自己做一个集成了这个工具的代码编辑器,于是才有了这个项目。
这个软件的代码托管在github->stcflash,里面说了支持以下的芯片:STC89C5xRC, STC89C5xRD+, STC90C5xRC, STC10Fxx, STC11Fxx, STC12Cx052x, STC12C52xx, STC12C56xx, STC12C5Axx。芯片都比较老了,我就增加了STC15F2K60S2,STC8F2K32S2,STC8A8K64S4A12。我增加的芯片功能打了折扣,只能支持有限的晶振:5.5296M,11.0592M,18.432M,22.1184M 。因为我没办法总结出规律。
源码分析请看第9章《STC51烧写协议及实现》。