PYQT5:基于QsciScintilla的代码编辑器分析10--语法高亮颜色选择
这里提供本编辑器可执行文件(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--语法高亮颜色选择相关推荐
- PYQT5:基于QsciScintilla的代码编辑器分析1--菜单介绍(使用帮助,提供exe文件、源代码下载)
本代码编辑器实现的目标功能: 1.常用的代码编辑功能,提高编辑效率的功能,如语法高亮显示,输入自动补全(基于QsciScintilla),函数列表,函数跳转,包含文件打开. 2. 设置编译器路径,编译 ...
- C# 代码编辑器实现篇-语法高亮
创建 C# 编辑器 实现效果 实现步骤 本片介绍基于 AvalonEdit 实现一个支持语法高亮的 C# 编辑器 实现效果 语法高亮 点击编译 实现步骤 在VS中创建窗体应用程序.通过 Nuget 引 ...
- ue编辑器c语言语法高亮文件,自己动手做 UEStudio/UltraEdit 的语法高亮文件 (*.uew)...
自己一直比较习惯用 UEStudio 来编写 C/C++ 文件,因为 Visual Studio 2010 实在太大了,我的 T400 都跑的费劲,所以一般我只用它来编译和调试.但是可惜的是 UESt ...
- ue编辑器c语言语法高亮文件,再见UE之VS Code初体验---实现远端Linux C开发配置,ue初体验...
再见UE之VS Code初体验---实现远端Linux C开发配置,ue初体验 一.引言 笔者以前使用的远端开发工具为 Xshell5 + Xftp5 + Source Insight4++Uedit ...
- 基于浏览器的在线代码编辑器
1. Compilr Compilr是一个在线编译器和在线IDE.可以用它来开发PHP, C, C++, Ruby.在浏览器中编译Java, C# 和 VB.net等. 马上使用 2. Dabbl ...
- python软件包自带的集成开发环境-Python的10大集成开发环境和代码编辑器(指南)...
使用IDLE或者Python Shell来编写Python是非常适合于简单程序的,但是这些工具往往将大型的编程项目变成一个个充满绝望和沮丧的"坑".使用一款集成开发环境甚至是一款好 ...
- python自带的集成开发环境是什么-Python的10大集成开发环境和代码编辑器(指南)...
使用IDLE或者Python Shell来编写Python是非常适合于简单程序的,但是这些工具往往将大型的编程项目变成一个个充满绝望和沮丧的"坑".使用一款集成开发环境甚至是一款好 ...
- Python的10大集成开发环境和代码编辑器(指南)
分享一篇文章,原文链接:Python IDEs and Code Editors (Guide). 使用IDLE或者Python Shell来编写Python是非常适合于简单程序的,但是这些工具往往将 ...
- python手机代码编辑器_10 个 Python IDE 和代码编辑器
2020 版10 个最佳 Python IDE 和代码编辑器 简单的语法和更快的执行速度使Python成为程序员中的首选语言. 它广泛用于创建网站,主要用于大数据操作. 为了简化运行Python程序的 ...
- 18款适用于开发人员的网页代码编辑器
本文介绍18款极具价值的网页代码编辑器. 1.Codeanywhere Codeanywhere是运行在浏览器上的代码编辑器,内嵌一个强大的FTP客户端.目前支持多数流行的网页格式(HTML.PHP. ...
最新文章
- mlcc激光雷达与相机外参标定初体验
- 浅谈ES6原生Promise
- c程序设计语言_习题1-9_将输入流复制到输出流,并将多个空格过滤成一个空格...
- Jdk1.6 JUC源码解析(13)-LinkedBlockingQueue
- halcon算子盘点:Chapter 13:对象、Chapter 14 区域
- 戴尔win10插耳机还外放_通州附近戴尔笔记本电脑维修哪家强-北京信维佳业科技有限公司...
- 巨省显存的重计算技巧在TF、Keras中的正确打开方式
- 腾讯2017暑期实习编程题3
- pytorch与Keras对应模型Sequential()和add()
- 【语音隐写】基于matlab小波变换算法求解水印嵌入提取【含Matlab源码 513期】
- linux系统调用使用方法,Linux系统的使用以及系统调用的开发方法OS.ppt
- arcengine 加载地图不显示_Devexpress使用后arcengine地图加载不能全图显示
- Excel 2010 VBA 入门 004 保存带有宏的工作薄
- 2020-04-19-如何在博客中添加视频链接
- 神经网络 深度神经网络,深度神经网络训练
- VS2008 使用小技巧-------快捷键
- 中国联通cdma 1x和中国移动gprs数据业务比较
- 组策略中的软件限制策略
- 鸿蒙开放机型,鸿蒙今天对友商打响了第一炮!华为多款机型开启鸿蒙尝鲜
- IntelliJ IDEA 运行卡顿解决方案