这里提供本编辑器可执行文件(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》。
————————————————
版权声明:本文为CSDN博主「hwd00001」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hwd00001/article/details/103082826

这个编辑器在使用过程中,有时候觉得某些颜色不好,要更改,所以在编辑器中增加了语法高亮的颜色选择。位置在《菜单->设置->颜色设置》:

1.颜色设置对话框

1.1 使用Qt Designer生成界面代码

先在Qt Designer画好一个Dialog,(默认的全部是黑色字体,下图是在初始化时改变了字体颜色)

自动生成下面的代码:

class Ui_Dialog(object):def setupUi(self, Dialog):Dialog.setObjectName("Dialog")Dialog.resize(312, 324)Dialog.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))Dialog.setAcceptDrops(False)Dialog.setSizeGripEnabled(True)Dialog.setModal(False)self.listStyles = QtWidgets.QListWidget(Dialog)self.listStyles.setGeometry(QtCore.QRect(10, 40, 181, 271))self.listStyles.setFrameShadow(QtWidgets.QFrame.Plain)self.listStyles.setObjectName("listStyles")item = QtWidgets.QListWidgetItem()self.listStyles.addItem(item)item = QtWidgets.QListWidgetItem()self.listStyles.addItem(item)item = QtWidgets.QListWidgetItem()self.listStyles.addItem(item)item = QtWidgets.QListWidgetItem()self.listStyles.addItem(item)item = QtWidgets.QListWidgetItem()self.listStyles.addItem(item)item = QtWidgets.QListWidgetItem()self.listStyles.addItem(item)item = QtWidgets.QListWidgetItem()self.listStyles.addItem(item)item = QtWidgets.QListWidgetItem()self.listStyles.addItem(item)item = QtWidgets.QListWidgetItem()self.listStyles.addItem(item)item = QtWidgets.QListWidgetItem()self.listStyles.addItem(item)item = QtWidgets.QListWidgetItem()self.listStyles.addItem(item)item = QtWidgets.QListWidgetItem()self.listStyles.addItem(item)item = QtWidgets.QListWidgetItem()self.listStyles.addItem(item)item = QtWidgets.QListWidgetItem()self.listStyles.addItem(item)self.defaultButton = QtWidgets.QPushButton(Dialog)self.defaultButton.setGeometry(QtCore.QRect(220, 140, 75, 23))self.defaultButton.setMaximumSize(QtCore.QSize(16777215, 16777215))self.defaultButton.setObjectName("defaultButton")self.okButton = QtWidgets.QPushButton(Dialog)self.okButton.setGeometry(QtCore.QRect(220, 210, 75, 23))self.okButton.setMaximumSize(QtCore.QSize(16777215, 16777215))self.okButton.setObjectName("okButton")self.cancelButton = QtWidgets.QPushButton(Dialog)self.cancelButton.setGeometry(QtCore.QRect(220, 280, 75, 23))self.cancelButton.setObjectName("cancelButton")self.label = QtWidgets.QLabel(Dialog)self.label.setGeometry(QtCore.QRect(10, 10, 171, 21))self.label.setObjectName("label")self.retranslateUi(Dialog)self.okButton.clicked.connect(Dialog.accept)    #Dialog.accept() 是内建函数,不用使用者实现self.cancelButton.clicked.connect(Dialog.reject) #Dialog.reject() 是内建函数,不用使用者实现QtCore.QMetaObject.connectSlotsByName(Dialog)def retranslateUi(self, Dialog):_translate = QtCore.QCoreApplication.translateDialog.setWindowTitle(_translate("Dialog", "color Dialog"))__sortingEnabled = self.listStyles.isSortingEnabled()self.listStyles.setSortingEnabled(False)item = self.listStyles.item(0)item.setText(_translate("Dialog", "Default"))item = self.listStyles.item(1)item.setText(_translate("Dialog", "Keyword"))item = self.listStyles.item(2)item.setText(_translate("Dialog", "KeywordSet2"))item = self.listStyles.item(3)item.setText(_translate("Dialog", "CommentDoc"))item = self.listStyles.item(4)item.setText(_translate("Dialog", "Comment"))item = self.listStyles.item(5)item.setText(_translate("Dialog", "CommentLine"))item = self.listStyles.item(6)item.setText(_translate("Dialog", "Number"))item = self.listStyles.item(7)item.setText(_translate("Dialog", "DoubleQuotedString"))item = self.listStyles.item(8)item.setText(_translate("Dialog", "SingleQuotedString"))item = self.listStyles.item(9)item.setText(_translate("Dialog", "PreProcessor"))item = self.listStyles.item(10)item.setText(_translate("Dialog", "Operator"))item = self.listStyles.item(11)item.setText(_translate("Dialog", "UnclosedString"))item = self.listStyles.item(12)item.setText(_translate("Dialog", "Background"))item = self.listStyles.item(13)item.setText(_translate("Dialog", "CaretLine"))self.listStyles.setSortingEnabled(__sortingEnabled)self.defaultButton.setText(_translate("Dialog", "默认"))self.okButton.setText(_translate("Dialog", "OK"))self.cancelButton.setText(_translate("Dialog", "CANCEL"))self.label.setText(_translate("Dialog", "点击相应文字,即可修改颜色"))

1.2 响应对话框动作的代码

新建一个ColorDlg类,继承于上面的Ui_Dialog类,可以使界面和动作的改动互不影响。

class   ColorDlg(QDialog,Ui_Dialog):def __init__(self, parent=None):super(ColorDlg, self).__init__(parent)self.setupUi(self)if parent == None:return#1.主窗口作为父窗口 ,颜色的初始值由主窗口传入self.parent = parent  self.DlgRepaint()def DlgRepaint(self):#2.设置每个item的颜色for i in range(0, self.listStyles.count()):itm = self.listStyles.item(i)cl=QColor(self.parent.colorDict[itm.text()])#2.1 编辑区的背景 和 焦点行背景,设置底色if itm.text() == 'Background' or itm.text() == 'CaretLine':itm. setBackground(cl)#2.2 其它项设置字体颜色else:itm.setForeground(cl)            self.repaint()# QListWidget的单击信号的槽函数def on_listStyles_clicked(self):itm=self.listStyles.currentItem()cl=QColorDialog.getColor(QColor(self.parent.colorDict[itm.text()]))if cl.isValid():try:self.parent.colorDict[itm.text()] = cl.name()   #把有效的颜色保存到颜色字典中except:pass# 把刚刚点击的地方更新颜色if itm.text() == 'Background' or itm.text() == 'CaretLine':itm. setBackground(cl)else:itm.setForeground(cl)def on_defaultButton_clicked(self):global g_colorDictself.parent.colorDict=copy.deepcopy(g_colorDict)  self.DlgRepaint()

上面ColorDlg.on_listStyles_clicked(self)这个函数,无须显式使用self.listStyles.clicked.connect(self.on_listStyles_clicked),只要使用 on_控件名_clicked()的模式命名槽函数,编译器就自动把槽函数链接到信号上。
ColorDlg.on_defaultButton_clicked()这个是“默认”按钮的槽函数,将一个默认的颜色字典复制到主窗口的颜色字典,恢复出厂设置。
这个文件的完整代码放到最后,以免影响后面的内容。

2.主窗口调用颜色设置对话框

在MainWindow.init()中,在”菜单->设置“增加一个颜色设置的动作,以及从《setting.ini》读取已保存的颜色设置:

     ......#初始化颜色字典self.colorDict=copy.deepcopy(g_colorDict)......colorSettingAction = self.createAction("颜色设置", self.OpenColorSettingDlg, None, None, '设置关键字颜色', checkable=False)self.addActions(SettingMenu,(SettingAction, complierSettingAction,colorSettingAction ))......        #读取 style 颜色        for style in self.colorDict.keys():str1 = 'color/' + stylestr1 = settings.value(str1)if str1 is not None:self.colorDict[style] = str1

调用颜色对话框的槽函数代码:

    def OpenColorSettingDlg(self):SettingDlg = ColorDlg(self)#2.打开对话框    ret = SettingDlg.exec_()if not ret :return#3.保存设置settings=QSettings("setting.ini",QSettings.IniFormat)for style in self.colorDict.keys():str1 = 'color/' + stylesettings.setValue(str1, self.colorDict[style])        #4.将打开的文件关闭再重新打开    self.repaintMDI()

3.语法高亮的颜色设置在LexerCPP中实现

在第5章 5–多文档编辑区介绍的《MyLexerCPP》代码中,关于颜色的设置是常数:

        self.setColor(QColor("#B0171F"), QsciLexerCPP.Keyword)

变成这样即可:

        self.setColor(QColor(self.parent().win.colorDict['Keyword'                    ]), QsciLexerCPP.Keyword )

关于背景色,有一个地方要注意,如果仅仅这样设置:

        self.setPaper(QColor(self.parent().win.colorDict[ 'Background'  ]))    #设置底色

底色不能覆盖这个屏幕,效果是这样的:

还有加上下面的代码:

        for i in range(0, QsciScintillaBase.STYLE_MAX):desc = self.description(i)if desc: self.setEolFill(True, i)    #将填充的底色延伸到屏幕的右端;否则默认只有文字的地方。

这样才可以达到理想的效果:

4.ColorDlg的完整代码

# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import copy
g_colorDict={'Default'                  :'#000000','Keyword'                  :'#B0171F'   ,        'KeywordSet2'            :'#7f0000'   ,'CommentDoc'              :'#008000'    , 'Comment'                  :'#008000'    , 'CommentLine'            :'#008000'    ,'Number'                    :'#007f7f' ,'DoubleQuotedString' :'#ff00ff'   ,'SingleQuotedString' :'#ff00ff'  ,'PreProcessor'           :'#be07ff'  ,   'Operator'                 :'#191970','UnclosedString'       :'#0000FF', 'Background'              :'#b2b2b2', 'CaretLine'              :'#FFCFCF'  }
class Ui_Dialog(object):def setupUi(self, Dialog):Dialog.setObjectName("Dialog")Dialog.resize(312, 324)Dialog.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))Dialog.setAcceptDrops(False)Dialog.setSizeGripEnabled(True)Dialog.setModal(False)self.listStyles = QtWidgets.QListWidget(Dialog)self.listStyles.setGeometry(QtCore.QRect(10, 40, 181, 271))self.listStyles.setFrameShadow(QtWidgets.QFrame.Plain)self.listStyles.setObjectName("listStyles")item = QtWidgets.QListWidgetItem()self.listStyles.addItem(item)item = QtWidgets.QListWidgetItem()self.listStyles.addItem(item)item = QtWidgets.QListWidgetItem()self.listStyles.addItem(item)item = QtWidgets.QListWidgetItem()self.listStyles.addItem(item)item = QtWidgets.QListWidgetItem()self.listStyles.addItem(item)item = QtWidgets.QListWidgetItem()self.listStyles.addItem(item)item = QtWidgets.QListWidgetItem()self.listStyles.addItem(item)item = QtWidgets.QListWidgetItem()self.listStyles.addItem(item)item = QtWidgets.QListWidgetItem()self.listStyles.addItem(item)item = QtWidgets.QListWidgetItem()self.listStyles.addItem(item)item = QtWidgets.QListWidgetItem()self.listStyles.addItem(item)item = QtWidgets.QListWidgetItem()self.listStyles.addItem(item)item = QtWidgets.QListWidgetItem()self.listStyles.addItem(item)item = QtWidgets.QListWidgetItem()self.listStyles.addItem(item)self.defaultButton = QtWidgets.QPushButton(Dialog)self.defaultButton.setGeometry(QtCore.QRect(220, 140, 75, 23))self.defaultButton.setMaximumSize(QtCore.QSize(16777215, 16777215))self.defaultButton.setObjectName("defaultButton")self.okButton = QtWidgets.QPushButton(Dialog)self.okButton.setGeometry(QtCore.QRect(220, 210, 75, 23))self.okButton.setMaximumSize(QtCore.QSize(16777215, 16777215))self.okButton.setObjectName("okButton")self.cancelButton = QtWidgets.QPushButton(Dialog)self.cancelButton.setGeometry(QtCore.QRect(220, 280, 75, 23))self.cancelButton.setObjectName("cancelButton")self.label = QtWidgets.QLabel(Dialog)self.label.setGeometry(QtCore.QRect(10, 10, 171, 21))self.label.setObjectName("label")self.retranslateUi(Dialog)self.okButton.clicked.connect(Dialog.accept)    #Dialog.accept() 是内建函数,不用使用者实现self.cancelButton.clicked.connect(Dialog.reject)    #Dialog.reject() 是内建函数,不用使用者实现QtCore.QMetaObject.connectSlotsByName(Dialog)def retranslateUi(self, Dialog):_translate = QtCore.QCoreApplication.translateDialog.setWindowTitle(_translate("Dialog", "color Dialog"))__sortingEnabled = self.listStyles.isSortingEnabled()self.listStyles.setSortingEnabled(False)item = self.listStyles.item(0)item.setText(_translate("Dialog", "Default"))item = self.listStyles.item(1)item.setText(_translate("Dialog", "Keyword"))item = self.listStyles.item(2)item.setText(_translate("Dialog", "KeywordSet2"))item = self.listStyles.item(3)item.setText(_translate("Dialog", "CommentDoc"))item = self.listStyles.item(4)item.setText(_translate("Dialog", "Comment"))item = self.listStyles.item(5)item.setText(_translate("Dialog", "CommentLine"))item = self.listStyles.item(6)item.setText(_translate("Dialog", "Number"))item = self.listStyles.item(7)item.setText(_translate("Dialog", "DoubleQuotedString"))item = self.listStyles.item(8)item.setText(_translate("Dialog", "SingleQuotedString"))item = self.listStyles.item(9)item.setText(_translate("Dialog", "PreProcessor"))item = self.listStyles.item(10)item.setText(_translate("Dialog", "Operator"))item = self.listStyles.item(11)item.setText(_translate("Dialog", "UnclosedString"))item = self.listStyles.item(12)item.setText(_translate("Dialog", "Background"))item = self.listStyles.item(13)item.setText(_translate("Dialog", "CaretLine"))self.listStyles.setSortingEnabled(__sortingEnabled)self.defaultButton.setText(_translate("Dialog", "默认"))self.okButton.setText(_translate("Dialog", "OK"))self.cancelButton.setText(_translate("Dialog", "CANCEL"))self.label.setText(_translate("Dialog", "点击相应文字,即可修改颜色"))class   ColorDlg(QDialog,Ui_Dialog):def __init__(self, parent=None):super(ColorDlg, self).__init__(parent)self.setupUi(self)if parent == None:return#1.主窗口作为父窗口 ,颜色的初始值由主窗口传入self.parent = parent  self.DlgRepaint()def DlgRepaint(self):#2.设置每个item的颜色for i in range(0, self.listStyles.count()):itm = self.listStyles.item(i)cl=QColor(self.parent.colorDict[itm.text()])#2.1 编辑区的背景 和 焦点行背景,设置底色if itm.text() == 'Background' or itm.text() == 'CaretLine':itm. setBackground(cl)#2.2 其它项设置字体颜色else:itm.setForeground(cl)            self.repaint()#3. 点击查找按钮的信号的槽函数def on_listStyles_clicked(self):itm=self.listStyles.currentItem()cl=QColorDialog.getColor(QColor(self.parent.colorDict[itm.text()]))if cl.isValid():try:self.parent.colorDict[itm.text()] = cl.name()   #把有效的颜色保存到颜色字典中except:pass# 把刚刚点击的地方更新颜色if itm.text() == 'Background' or itm.text() == 'CaretLine':itm. setBackground(cl)else:itm.setForeground(cl)#self.repaint()def on_defaultButton_clicked(self):global g_colorDictself.parent.colorDict=copy.deepcopy(g_colorDict)  self.DlgRepaint()
'''
if __name__ == "__main__":import sysapp = QtWidgets.QApplication(sys.argv)#Dialog = QtWidgets.QDialog()ui = ColorDlg()#ui.setupUi(Dialog)ui.show()sys.exit(app.exec_())
'''

PYQT5:基于QsciScintilla的代码编辑器分析10--语法高亮颜色选择相关推荐

  1. PYQT5:基于QsciScintilla的代码编辑器分析1--菜单介绍(使用帮助,提供exe文件、源代码下载)

    本代码编辑器实现的目标功能: 1.常用的代码编辑功能,提高编辑效率的功能,如语法高亮显示,输入自动补全(基于QsciScintilla),函数列表,函数跳转,包含文件打开. 2. 设置编译器路径,编译 ...

  2. C# 代码编辑器实现篇-语法高亮

    创建 C# 编辑器 实现效果 实现步骤 本片介绍基于 AvalonEdit 实现一个支持语法高亮的 C# 编辑器 实现效果 语法高亮 点击编译 实现步骤 在VS中创建窗体应用程序.通过 Nuget 引 ...

  3. ue编辑器c语言语法高亮文件,自己动手做 UEStudio/UltraEdit 的语法高亮文件 (*.uew)...

    自己一直比较习惯用 UEStudio 来编写 C/C++ 文件,因为 Visual Studio 2010 实在太大了,我的 T400 都跑的费劲,所以一般我只用它来编译和调试.但是可惜的是 UESt ...

  4. ue编辑器c语言语法高亮文件,再见UE之VS Code初体验---实现远端Linux C开发配置,ue初体验...

    再见UE之VS Code初体验---实现远端Linux C开发配置,ue初体验 一.引言 笔者以前使用的远端开发工具为 Xshell5 + Xftp5 + Source Insight4++Uedit ...

  5. 基于浏览器的在线代码编辑器

    1. Compilr Compilr是一个在线编译器和在线IDE.可以用它来开发PHP, C, C++, Ruby.在浏览器中编译Java, C# 和 VB.net等.   马上使用 2. Dabbl ...

  6. python软件包自带的集成开发环境-Python的10大集成开发环境和代码编辑器(指南)...

    使用IDLE或者Python Shell来编写Python是非常适合于简单程序的,但是这些工具往往将大型的编程项目变成一个个充满绝望和沮丧的"坑".使用一款集成开发环境甚至是一款好 ...

  7. python自带的集成开发环境是什么-Python的10大集成开发环境和代码编辑器(指南)...

    使用IDLE或者Python Shell来编写Python是非常适合于简单程序的,但是这些工具往往将大型的编程项目变成一个个充满绝望和沮丧的"坑".使用一款集成开发环境甚至是一款好 ...

  8. Python的10大集成开发环境和代码编辑器(指南)

    分享一篇文章,原文链接:Python IDEs and Code Editors (Guide). 使用IDLE或者Python Shell来编写Python是非常适合于简单程序的,但是这些工具往往将 ...

  9. python手机代码编辑器_10 个 Python IDE 和代码编辑器

    2020 版10 个最佳 Python IDE 和代码编辑器 简单的语法和更快的执行速度使Python成为程序员中的首选语言. 它广泛用于创建网站,主要用于大数据操作. 为了简化运行Python程序的 ...

  10. 18款适用于开发人员的网页代码编辑器

    本文介绍18款极具价值的网页代码编辑器. 1.Codeanywhere Codeanywhere是运行在浏览器上的代码编辑器,内嵌一个强大的FTP客户端.目前支持多数流行的网页格式(HTML.PHP. ...

最新文章

  1. mlcc激光雷达与相机外参标定初体验
  2. 浅谈ES6原生Promise
  3. c程序设计语言_习题1-9_将输入流复制到输出流,并将多个空格过滤成一个空格...
  4. Jdk1.6 JUC源码解析(13)-LinkedBlockingQueue
  5. halcon算子盘点:Chapter 13:对象、Chapter 14 区域
  6. 戴尔win10插耳机还外放_通州附近戴尔笔记本电脑维修哪家强-北京信维佳业科技有限公司...
  7. 巨省显存的重计算技巧在TF、Keras中的正确打开方式
  8. 腾讯2017暑期实习编程题3
  9. pytorch与Keras对应模型Sequential()和add()
  10. 【语音隐写】基于matlab小波变换算法求解水印嵌入提取【含Matlab源码 513期】
  11. linux系统调用使用方法,Linux系统的使用以及系统调用的开发方法OS.ppt
  12. arcengine 加载地图不显示_Devexpress使用后arcengine地图加载不能全图显示
  13. Excel 2010 VBA 入门 004 保存带有宏的工作薄
  14. 2020-04-19-如何在博客中添加视频链接
  15. 神经网络 深度神经网络,深度神经网络训练
  16. VS2008 使用小技巧-------快捷键
  17. 中国联通cdma 1x和中国移动gprs数据业务比较
  18. 组策略中的软件限制策略
  19. 鸿蒙开放机型,鸿蒙今天对友商打响了第一炮!华为多款机型开启鸿蒙尝鲜
  20. IntelliJ IDEA 运行卡顿解决方案

热门文章

  1. 企业文化之华为和汤森路透
  2. 展锐sc8541E多媒体网络摄像播放-液晶驱动一体板
  3. 手机信号强度dbm与天线格度的关系
  4. ORACLE 树形遍历查询根节点 父节点 子节点
  5. MASM6.11安装
  6. Python自然语言处理—停用词词典
  7. AICreateMeeting-遇见未来
  8. 普林斯顿微积分读本06第五章--连续性
  9. java 监听udp_Java实现Udp网络编程
  10. python获取淘宝服务器时间_分享淘宝时间服务器同步时间接口api和苏宁时间服务器接口api...