QScintilla

以下只是部分代码,需要完整代码点这里(不要积分哦):这里

最近一直在使用sublime text 3,发现sublime text相当好用,但是在windows上主题定制上还是不够完善,所以笔者也想开发一款类似的代码编辑器,拥有更加强大的主题定制功能。以下是我学习QScintilla时候做的笔记以及一个小demo,希望能够帮到想要学习QScintilla的同学。最后还有一个小问题没有解决:代码折叠以后QScintilla会有一条折叠线,找了很多资料都无法去除这条线,如果有解决的同学一定要告诉我解决方法哦!希望这个小demo能够帮到你!

最后使用环境是:python3.3.5和PyQt5.2.1

上一张效果图,有图有真相:


#!/usr/bin/python
#conding=utf-8

#中文

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.Qsci import *
from util import ReadStyleSheet
import sys

class ScintillaEditor(QWidget):
	"""docstring for Scintilla"""

	scintilla = None
	font = None
	fontmetrics = None

	def __init__(self,parent=None):
		super(ScintillaEditor, self).__init__(parent)

		self.__init_window__()
		self.__init_ui__()
		self.__layout__()

		self.scintilla.textChanged.connect(self.textChanged)
		self.scintilla.linesChanged.connect(self.linesChanged)

	def linesChanged(self):
		print(self.scintilla.lines())
		self.scintilla.setMarginWidth(0, self.fontmetrics.width(str(self.scintilla.lines())) + 5)
		pass

	def textChanged(self):
		print("textChanged")
		pass

	def keyPressEvent(self,event):
		print("keyPressEvent")

	def __layout__(self):
		self.layout = QVBoxLayout()
		self.layout.setAlignment(Qt.AlignVCenter)
		self.layout.setContentsMargins(0,0,0,0)
		self.layout.setSpacing(0)
		self.layout.addWidget(self.label,False,Qt.AlignVCenter)
		self.layout.addWidget(self.scintilla)
		self.setLayout(self.layout)

	def __init_ui__(self):
		self.__init_scintilla__()
		self.__init_label__()

	def __init_label__(self):
		self.label = QLabel("Coder")
		self.label.setAlignment(Qt.AlignHCenter|Qt.AlignVCenter)
		self.label.setMinimumSize(0,30)

	def __init_window__(self):
		self.setWindowTitle("Coder")
		self.setMinimumSize(800,500)

		#set window no border
		#self.setWindowFlags(Qt.FramelessWindowHint)

		self.font = QFont()
		self.font.setFamily("Microsoft YaHei UI Light")
		self.font.setPointSize(10)
		self.font.setFixedPitch(True)
		self.setFont(self.font)

		self.fontmetrics = QFontMetrics(self.font)

	def __init_scintilla__(self):

		self.scintilla = QsciScintilla()
		self.scintilla.setUtf8(True)

		self.scintilla.setFont(self.font)
		self.scintilla.setMarginsFont(self.font)

		#set line number width
		self.scintilla.setMarginWidth(0, self.fontmetrics.width(str(self.scintilla.lines())) + 5)
		self.scintilla.setMarginLineNumbers(0, True)

		#mesure line
		self.scintilla.setEdgeMode(QsciScintilla.EdgeLine)
		self.scintilla.setEdgeColumn(150)
		self.scintilla.setEdgeColor(QColor("#BBB8B5"))

		#brace match
		self.scintilla.setBraceMatching(QsciScintilla.StrictBraceMatch)

		#current line color
		self.scintilla.setCaretLineVisible(True)
		self.scintilla.setCaretLineBackgroundColor(QColor("#2D2D2D"))
		self.scintilla.setCaretForegroundColor(QColor("white"))

		#selection color
		self.scintilla.setSelectionBackgroundColor(QColor("#606060"))
		self.scintilla.setSelectionForegroundColor(QColor("#FFFFFF"))

		#table relative
		self.scintilla.setIndentationsUseTabs(True)
		self.scintilla.setIndentationWidth(4)
		self.scintilla.setTabIndents(True)
		self.scintilla.setAutoIndent(True)
		self.scintilla.setBackspaceUnindents(True)
		self.scintilla.setTabWidth(4)

		#indentation guides
		self.scintilla.setIndentationGuides(True)

		#line number margin color
		self.scintilla.setMarginsBackgroundColor(QColor("#272727"))
		self.scintilla.setMarginsForegroundColor(QColor("#CCCCCC"))

		#folding margin
		self.scintilla.setFolding(QsciScintilla.PlainFoldStyle)
		self.scintilla.setMarginWidth(2,12)
		#marker
		self.scintilla.markerDefine(QsciScintilla.Minus,QsciScintilla.SC_MARKNUM_FOLDEROPEN)
		self.scintilla.markerDefine(QsciScintilla.Plus,QsciScintilla.SC_MARKNUM_FOLDER)
		self.scintilla.markerDefine(QsciScintilla.Minus,QsciScintilla.SC_MARKNUM_FOLDEROPENMID)
		self.scintilla.markerDefine(QsciScintilla.Plus,QsciScintilla.SC_MARKNUM_FOLDEREND)
		
		#marker define color
		self.scintilla.setMarkerBackgroundColor(QColor("#FFFFFF"),QsciScintilla.SC_MARKNUM_FOLDEREND)
		self.scintilla.setMarkerForegroundColor(QColor("#272727"),QsciScintilla.SC_MARKNUM_FOLDEREND)
		self.scintilla.setMarkerBackgroundColor(QColor("#FFFFFF"),QsciScintilla.SC_MARKNUM_FOLDEROPENMID)
		self.scintilla.setMarkerForegroundColor(QColor("#272727"),QsciScintilla.SC_MARKNUM_FOLDEROPENMID)
		#self.scintilla.setMarkerBackgroundColor(QColor("#FFFFFF"),QsciScintilla.SC_MARKNUM_FOLDERMIDTAIL)
		#self.scintilla.setMarkerForegroundColor(QColor("#272727"),QsciScintilla.SC_MARKNUM_FOLDERMIDTAIL)
		#self.scintilla.setMarkerBackgroundColor(QColor("#FFFFFF"),QsciScintilla.SC_MARKNUM_FOLDERTAIL)
		#self.scintilla.setMarkerForegroundColor(QColor("#272727"),QsciScintilla.SC_MARKNUM_FOLDERTAIL)
		self.scintilla.setMarkerBackgroundColor(QColor("#FFFFFF"),QsciScintilla.SC_MARKNUM_FOLDERSUB)
		self.scintilla.setMarkerForegroundColor(QColor("#272727"),QsciScintilla.SC_MARKNUM_FOLDERSUB)
		self.scintilla.setMarkerBackgroundColor(QColor("#FFFFFF"),QsciScintilla.SC_MARKNUM_FOLDER)
		self.scintilla.setMarkerForegroundColor(QColor("#272727"),QsciScintilla.SC_MARKNUM_FOLDER)
		self.scintilla.setMarkerBackgroundColor(QColor("#FFFFFF"),QsciScintilla.SC_MARKNUM_FOLDEROPEN)
		self.scintilla.setMarkerForegroundColor(QColor("#272727"),QsciScintilla.SC_MARKNUM_FOLDEROPEN)
		self.scintilla.setFoldMarginColors(QColor("#272727"),QColor("#272727"))

		#whitespace
		self.scintilla.setWhitespaceVisibility(QsciScintilla.WsInvisible)
		self.scintilla.setWhitespaceSize(2)
		"""
		the default margin is:

		0: line number,width is not zero
		1: width is zero
		2: folding, width is not zero

		"""
		self.scintilla.setMarginWidth(1,0)

		#set lexer
		self.lexer = QsciLexerPython()
		self.lexer.setFont(self.font)
		self.lexer.setColor(QColor("#ffffff"))
		self.scintilla.setLexer(self.lexer)

		#high light code
		self.lexer.setColor(QColor("#ffffff"))
		self.lexer.setPaper(QColor("#333333"))
		self.lexer.setColor(QColor("#5BA5F7"),QsciLexerPython.ClassName)
		self.lexer.setColor(QColor("#FF0B66"),QsciLexerPython.Keyword)
		self.lexer.setColor(QColor("#00FF40"),QsciLexerPython.Comment)
		self.lexer.setColor(QColor("#BD4FE8"),QsciLexerPython.Number)
		self.lexer.setColor(QColor("#F1E607"),QsciLexerPython.DoubleQuotedString)
		self.lexer.setColor(QColor("#F1E607"),QsciLexerPython.TripleSingleQuotedString)
		self.lexer.setColor(QColor("#F1E607"),QsciLexerPython.TripleDoubleQuotedString)
		self.lexer.setColor(QColor("#F1E607"),QsciLexerPython.DoubleQuotedString)
		self.lexer.setColor(QColor("#04F452"),QsciLexerPython.FunctionMethodName)
		self.lexer.setColor(QColor("#FFFFFF"),QsciLexerPython.Operator)
		self.lexer.setColor(QColor("#FFFFFF"),QsciLexerPython.Identifier)
		self.lexer.setColor(QColor("#F1E607"),QsciLexerPython.CommentBlock)
		self.lexer.setColor(QColor("#F1E607"),QsciLexerPython.UnclosedString)
		self.lexer.setColor(QColor("#F1E607"),QsciLexerPython.HighlightedIdentifier)
		self.lexer.setColor(QColor("#F1E607"),QsciLexerPython.Decorator)

		self.scintilla.setText(open("Editor.py",encoding="UTF8").read())
		self.scintilla.setMarginWidth(0, self.fontmetrics.width(str(self.scintilla.lines())) + 5)

if __name__ == "__main__":
	app = QApplication(sys.argv)
	window = ScintillaEditor()
	scrollbar = ReadStyleSheet.ReadStyleSheetFile("stylesheet/scrollbar.css")
	scintilla = ReadStyleSheet.ReadStyleSheetFile("stylesheet/scintilla.css")
	common = ReadStyleSheet.ReadStyleSheetFile("stylesheet/common.css")
	stylesheet = scrollbar + scintilla + common
	window.setStyleSheet(stylesheet)
	window.show()
	app.exec_()
	sys.exit()		


评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值