PYQT5:基于QsciScintilla的代码编辑器分析10--语法高亮颜色选择
這里提供本編輯器可執(zhí)行文件(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
讀者在調(diào)試代碼時(shí),可以直接運(yùn)行主文件《texteditor2.py》。
————————————————
版權(quán)聲明:本文為CSDN博主「hwd00001」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/hwd00001/article/details/103082826
這個(gè)編輯器在使用過程中,有時(shí)候覺得某些顏色不好,要更改,所以在編輯器中增加了語法高亮的顏色選擇。位置在《菜單->設(shè)置->顏色設(shè)置》:
1.顏色設(shè)置對話框
1.1 使用Qt Designer生成界面代碼
先在Qt Designer畫好一個(gè)Dialog,(默認(rèn)的全部是黑色字體,下圖是在初始化時(shí)改變了字體顏色)
自動生成下面的代碼:
1.2 響應(yīng)對話框動作的代碼
新建一個(gè)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.設(shè)置每個(gè)item的顏色for i in range(0, self.listStyles.count()):itm = self.listStyles.item(i)cl=QColor(self.parent.colorDict[itm.text()])#2.1 編輯區(qū)的背景 和 焦點(diǎn)行背景,設(shè)置底色if itm.text() == 'Background' or itm.text() == 'CaretLine':itm. setBackground(cl)#2.2 其它項(xiàng)設(shè)置字體顏色else:itm.setForeground(cl) self.repaint()# QListWidget的單擊信號的槽函數(shù)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# 把剛剛點(diǎn)擊的地方更新顏色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)這個(gè)函數(shù),無須顯式使用self.listStyles.clicked.connect(self.on_listStyles_clicked),只要使用 on_控件名_clicked()的模式命名槽函數(shù),編譯器就自動把槽函數(shù)鏈接到信號上。
ColorDlg.on_defaultButton_clicked()這個(gè)是“默認(rèn)”按鈕的槽函數(shù),將一個(gè)默認(rèn)的顏色字典復(fù)制到主窗口的顏色字典,恢復(fù)出廠設(shè)置。
這個(gè)文件的完整代碼放到最后,以免影響后面的內(nèi)容。
2.主窗口調(diào)用顏色設(shè)置對話框
在MainWindow.init()中,在”菜單->設(shè)置“增加一個(gè)顏色設(shè)置的動作,以及從《setting.ini》讀取已保存的顏色設(shè)置:
......#初始化顏色字典self.colorDict=copy.deepcopy(g_colorDict)......colorSettingAction = self.createAction("顏色設(shè)置", self.OpenColorSettingDlg, None, None, '設(shè)置關(guān)鍵字顏色', 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調(diào)用顏色對話框的槽函數(shù)代碼:
def OpenColorSettingDlg(self):SettingDlg = ColorDlg(self)#2.打開對話框 ret = SettingDlg.exec_()if not ret :return#3.保存設(shè)置settings=QSettings("setting.ini",QSettings.IniFormat)for style in self.colorDict.keys():str1 = 'color/' + stylesettings.setValue(str1, self.colorDict[style]) #4.將打開的文件關(guān)閉再重新打開 self.repaintMDI()3.語法高亮的顏色設(shè)置在LexerCPP中實(shí)現(xiàn)
在第5章 5–多文檔編輯區(qū)介紹的《MyLexerCPP》代碼中,關(guān)于顏色的設(shè)置是常數(shù):
self.setColor(QColor("#B0171F"), QsciLexerCPP.Keyword)變成這樣即可:
self.setColor(QColor(self.parent().win.colorDict['Keyword' ]), QsciLexerCPP.Keyword )關(guān)于背景色,有一個(gè)地方要注意,如果僅僅這樣設(shè)置:
self.setPaper(QColor(self.parent().win.colorDict[ 'Background' ])) #設(shè)置底色底色不能覆蓋這個(gè)屏幕,效果是這樣的:
還有加上下面的代碼:
這樣才可以達(dá)到理想的效果:
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() 是內(nèi)建函數(shù),不用使用者實(shí)現(xiàn)self.cancelButton.clicked.connect(Dialog.reject) #Dialog.reject() 是內(nèi)建函數(shù),不用使用者實(shí)現(xiàn)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", "默認(rèn)"))self.okButton.setText(_translate("Dialog", "OK"))self.cancelButton.setText(_translate("Dialog", "CANCEL"))self.label.setText(_translate("Dialog", "點(diǎn)擊相應(yīng)文字,即可修改顏色"))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.設(shè)置每個(gè)item的顏色for i in range(0, self.listStyles.count()):itm = self.listStyles.item(i)cl=QColor(self.parent.colorDict[itm.text()])#2.1 編輯區(qū)的背景 和 焦點(diǎn)行背景,設(shè)置底色if itm.text() == 'Background' or itm.text() == 'CaretLine':itm. setBackground(cl)#2.2 其它項(xiàng)設(shè)置字體顏色else:itm.setForeground(cl) self.repaint()#3. 點(diǎn)擊查找按鈕的信號的槽函數(shù)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# 把剛剛點(diǎn)擊的地方更新顏色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_()) '''總結(jié)
以上是生活随笔為你收集整理的PYQT5:基于QsciScintilla的代码编辑器分析10--语法高亮颜色选择的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle 细粒审核,oracle10
- 下一篇: 盘点三个JavaScript案例——实现