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烧写协议及实现》。

posted @ 2019-11-21 10:31  汉塘阿德  阅读(132)  评论(0编辑  收藏  举报  来源