pyqt颜色字符
from PyQt4.QtGui import QPlainTextEdit, QWidget, QVBoxLayout, QApplication, \
QFileDialog, QMessageBox, QTextBrowser, QDockWidget, \
QMainWindow, QIcon, QHBoxLayout, QPainter, QGraphicsWidget, \
QFontMetrics, QFrame, QTextEdit, QTextFormat, \
QTextBlockUserData, QColor, QFont, QTextCursor, \
QSyntaxHighlighter, QTextCharFormat
from PyQt4.QtCore import QString, SIGNAL as SIG, Qt, QEvent, QVariant,\
QRect, QRegExp, QThread
import sys, os, re
from subprocess import Popen, PIPE
NUMBER_BAR_COLOR = QColor(180, 215, 140)
BRACKET_MATCHED = QColor('blue')
BRACKET_UNMATCHED = QColor('red')
CURRENT_LINE_HL = QColor(200, 205, 0, 70)
class BracketsInfo:
def __init__(self, character, position):
self.character = character
self.position = position
class TextBlockData(QTextBlockUserData):
def __init__(self, parent = None):
super(TextBlockData, self).__init__()
self.braces = []
self.valid = False
def insert_brackets_info(self, info):
self.valid = True
self.braces.append(info)
def isValid(self):
return self.valid
class LaTeX(QSyntaxHighlighter):
command = QRegExp(r'\\(\w+)?')
cmd_fmt = QTextCharFormat()
cmd_fmt.setForeground(QColor('darkRed'))
comment = QRegExp(r'%(.*)?')
cmnt_fmt = QTextCharFormat()
cmnt_fmt.setForeground(QColor('gray'))
keywords = QRegExp(r'\\begin|\\end|\\label|\\ref|\\(sub)?(sub)?section')
keyword_fmt = QTextCharFormat()
keyword_fmt.setForeground(QColor('red'))
rules = [(command, cmd_fmt),
(comment, cmnt_fmt),
(keywords, keyword_fmt)]
def __init__(self, parent):
super(LaTeX, self).__init__(parent)
def highlightBlock(self, text):
braces = QRegExp('(\{|\}|\(|\)|\[|\])')
math_delimiters = QRegExp(r'(\\begin{equation\*?}|' +\
r'\\begin{align\*?}|' +\
r'\\begin{displaymath\*?})')
begin_end = QRegExp(r'(\\begin{|\\end{|\\ref|\\label)')
block_data = TextBlockData()
index = braces.indexIn(text)
while index >= 0:
matched_brace = str(braces.capturedTexts()[0])
info = BracketsInfo(matched_brace, index)
block_data.insert_brackets_info(info)
index = braces.indexIn(text, index + 1)
self.setCurrentBlockUserData(block_data)
for regex, fmt in LaTeX.rules:
start = regex.indexIn(text, 0)
while start >= 0:
length = regex.matchedLength()
self.setFormat(start, length, fmt)
start = regex.indexIn(text, start + length)
self.setCurrentBlockState(0)
class NumberBar(QWidget):
def __init__(self, parent = None):
super(NumberBar, self).__init__(parent)
self.edit = parent
layout = QVBoxLayout()
self.setLayout(layout)
self.edit.blockCountChanged.connect(self.update_width)
self.edit.updateRequest.connect(self.update_on_scroll)
self.update_width('1')
def update_on_scroll(self, rect, scroll):
if self.isVisible():
if scroll:
self.scroll(0, scroll)
else:
self.update()
def update_width(self, string):
width = self.fontMetrics().width(unicode(string)) + 20
if self.width() != width:
self.setFixedWidth(width)
def paintEvent(self, event):
if self.isVisible():
block = self.edit.firstVisibleBlock()
height = self.fontMetrics().height()
number = block.blockNumber()
painter = QPainter(self)
painter.fillRect(event.rect(), NUMBER_BAR_COLOR)
font = painter.font()
current_block = self.edit.textCursor().block().blockNumber() + 1
condition = True
while block.isValid() and condition:
block_geometry = self.edit.blockBoundingGeometry(block)
offset = self.edit.contentOffset()
block_top = block_geometry.translated(offset).top()
number += 1
rect = QRect(0, block_top, self.width() - 5, height)
if number == current_block:
font.setBold(True)
else:
font.setBold(False)
painter.setFont(font)
painter.drawText(rect, Qt.AlignRight, '%i'%number)
if block_top > event.rect().bottom():
condition = False
block = block.next()
painter.end()
class QLaTeXEdit(QWidget):
def __init__(self, parent = None):
super(QLaTeXEdit, self).__init__(parent)
# Editor Widget ...
self.edit = QPlainTextEdit()
self.edit.setFrameStyle(QFrame.NoFrame)
self.extra_selections = []
# Line Numbers ...
self.numbers = NumberBar(self.edit)
# Syntax Highlighter ...
self.highlighter = LaTeX(self.edit.document())
# Laying out...
layout = QHBoxLayout()
layout.setSpacing(1.5)
layout.addWidget(self.numbers)
layout.addWidget(self.edit)
self.setLayout(layout)
# Event Filter ...
self.installEventFilter(self)
self.edit.cursorPositionChanged.connect(self.check_brackets)
# Brackets ExtraSelection ...
self.left_selected_bracket = QTextEdit.ExtraSelection()
self.right_selected_bracket = QTextEdit.ExtraSelection()
def set_numbers_visible(self, value = True):
self.numbers.setVisible(False)
def match_left(self, block, character, start, found):
map = {'{': '}', '(': ')', '[': ']'}
while block.isValid():
data = block.userData()
if data is not None:
braces = data.braces
N = len(braces)
for k in range(start, N):
if braces[k].character == character:
found += 1
if braces[k].character == map[character]:
if not found:
return braces[k].position + block.position()
else:
found -= 1
block = block.next()
start = 0
def match_right(self, block, character, start, found):
map = {'}': '{', ')': '(', ']': '['}
while block.isValid():
data = block.userData()
if data is not None:
braces = data.braces
if start is None:
start = len(braces)
for k in range(start - 1, -1, -1):
if braces[k].character == character:
found += 1
if braces[k].character == map[character]:
if found == 0:
return braces[k].position + block.position()
else:
found -= 1
block = block.previous()
start = None
def check_brackets(self):
left, right = QTextEdit.ExtraSelection(),\
QTextEdit.ExtraSelection()
cursor = self.edit.textCursor()
block = cursor.block()
data = block.userData()
previous, next = None, None
if data is not None:
position = cursor.position()
block_position = cursor.block().position()
braces = data.braces
N = len(braces)
for k in range(0, N):
if braces[k].position == position - block_position or\
braces[k].position == position - block_position - 1:
previous = braces[k].position + block_position
if braces[k].character in ['{', '(', '[']:
next = self.match_left(block,
braces[k].character,
k + 1, 0)
elif braces[k].character in ['}', ')', ']']:
next = self.match_right(block,
braces[k].character,
k, 0)
if next is None:
next = -1
if next is not None and next > 0:
if next == 0 and next >= 0:
format = QTextCharFormat()
cursor.setPosition(previous)
cursor.movePosition(QTextCursor.NextCharacter,
QTextCursor.KeepAnchor)
format.setForeground(BRACKET_MATCHED)
format.setBackground(QColor('white'))
self.left_selected_bracket.format = format
self.left_selected_bracket.cursor = cursor
cursor.setPosition(next)
cursor.movePosition(QTextCursor.NextCharacter,
QTextCursor.KeepAnchor)
format.setForeground(BRACKET_MATCHED)
format.setBackground(QColor('white'))
self.right_selected_bracket.format = format
self.right_selected_bracket.cursor = cursor
def paintEvent(self, event):
highlighted_line = QTextEdit.ExtraSelection()
highlighted_line.format.setBackground(CURRENT_LINE_HL)
highlighted_line.format.setProperty(QTextFormat\
.FullWidthSelection,
QVariant(True))
highlighted_line.cursor = self.edit.textCursor()
highlighted_line.cursor.clearSelection()
self.edit.setExtraSelections([highlighted_line,
self.left_selected_bracket,
self.right_selected_bracket])
def document(self):
return self.edit.document
def getPlainText(self):
return unicode(self.edit.toPlainText())
def isModified(self):
return self.edit.document().isModified()
def setModified(self, modified):
self.edit.document().setModified(modified)
def setLineWrapMode(self, mode):
self.edit.setLineWrapMode(mode)
def clear(self):
self.edit.clear()
def setPlainText(self, *args, **kwargs):
self.edit.setPlainText(*args, **kwargs)
def setDocumentTitle(self, *args, **kwargs):
self.edit.setDocumentTitle(*args, **kwargs)
def eventFilter(self, object, event):
if event.type() == QEvent.KeyPress:
if event.key() == Qt.Key_Return:
QPlainTextEdit.event(self, event)
print 'return pressed'
return True
if event.key() == Qt.Key_F6:
self.emit(SIG('pdflatex'))
return True
if event.key() == Qt.Key_F7:
self.emit(SIG('pdfshow'))
return True
if event.key() == Qt.Key_S and\
event.modifiers() == Qt.ControlModifier:
self.emit(SIG('save_document'))
return True
if event.key() == Qt.Key_O and\
event.modifiers() == Qt.ControlModifier:
self.emit(SIG('open_document'))
return True
if event.key() == Qt.Key_N and\
event.modifiers() == Qt.ControlModifier:
self.emit(SIG('new_document'))
return True
if event.key() == Qt.Key_W and\
event.modifiers() == Qt.ControlModifier:
self.emit(SIG('close_document'))
return True
else:
return False
return False
def set_number_bar_visible(self, value):
self.numbers.setVisible(value)
if __name__ == '__main__':
app = QApplication(sys.argv)
win = QLaTeXEdit()
win.show()
app.exec_()

pyqt颜色字符的更多相关文章
- Linux Shell输出颜色字符学习笔记(附Python脚本实现自动化定制生成)
齿轮发出咔嚓一声,向前进了一格.而一旦向前迈进,齿轮就不能倒退了.这就是世界的规则. 0x01背景 造了个轮子:御剑师傅的ipintervalmerge的Python版本.觉得打印的提示信息如果是普通 ...
- python - 2 8 16进制/颜色/字符编码
1.二进制 八进制 十六进制 二进制: bin() 0b10010八进制: oct() 0o10十进制: 1-100十六进制: hex() 0X53 BH 十进制转2, 8,16进制: >> ...
- 显示log里的ansi codecs颜色字符
方法: vim AnsiEsc插件 http://www.vim.org/scripts/script.php?script_id=302 less -r cat和tail命令都可以正常显示,而且ta ...
- [转载]Linux下终端字体颜色设置方法
原文地址:Linux下终端字体颜色设置方法作者:router 网上类似的文章有很多,但是都是转来转去的,没有经过测试,按照很多文章的方法会造成你设置之后的终端在换行和删除输入字符时终端显示会乱七八糟, ...
- Markdown文字添加颜色
转自:原文地址 添加红色 效果: 写法: $\color{red}{red}$ 添加绿色 效果: 写法: $\color{green}{green}$ 添加蓝色 效果: 写法: $\color{blu ...
- Linux字符界面字符颜色显示
一.字符颜色 #!/bin/bash #字符颜色显示 #-e:允许echo使用转义 #\033[:开始位 #\033[0m:结束位 #\033等同于\e echo -e "\033[30m黑 ...
- 【canvas学习笔记三】样式和颜色
上一节我们学习了如何用路径绘制各种形状,但我们只能用默认的颜色和线条.这节就来学习设置不同的颜色和线条样式. 颜色 设置颜色主要有两个属性: fillStyle = color 设置填充颜色 stro ...
- HTML 学习笔记 CSS样式(文本)
CSS文本属性可以定义文本的外观 通过文本属性 您可以改变文本的颜色 字符间距 文本对齐装饰文本 对文本进行缩进等等. 缩进文本 把web页面上的段落的第一行缩进,这是最常用的文本格式化效果. css ...
- qt_文本编辑器实现_附带详细注释和源码下载
源码下载: 链接: http://pan.baidu.com/s/1c21EVRy 密码: qub8 实现主要的功能有:新建,打开,保存,另存为,查找(查找的时候需要先将光标放到最下面位置才能查全,不 ...
随机推荐
- 获得HttpServletResponse及其他对象
下面只列出获得 HttpServletResponse 对象的方法,获得 HttpServletRequest 对象方法类似. 在struts1.x Action类的execute方法中,有四个参数, ...
- Android 开发 对话框Dialog dismiss和hide方法的区别
http://ningtukun.blog.163.com/blog/static/186541445201310151539697/ dismiss和hide方法都可以隐藏对话框,在需要的时候也可以 ...
- Ignatius and the Princess III --undo
Ignatius and the Princess III Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (J ...
- JAVA把字符串当作表达式执行
直接能够穿一个字符串执行 private static void test(String pm1) { ScriptEngineManager manager = new ScriptEngineMa ...
- QT程序启动界面的使用
当程序的初始化工作比较多,程序可能启动较长时间后,窗口才会显示出来,用户没准会抱怨程序响应的慢. 为了改善用户体验,最好在程序初始化这段时间显示logo,或者其他信息提示用户程序已启动.QT提供了QS ...
- 〖转〗request.getparameter()和request.getAttribute()的区别
getAttribute表示从request范围取得设置的属性,必须要先setAttribute设置属性,才能通过getAttribute来取得,设置与取得的为Object对象类型 getParame ...
- CentOS6.X 系统安装图文教程,超详细
http://www.myhack58.com/Article/sort099/sort0102/2011/32363_7.htm
- AsyncHttpClient httpURLCon httpClient AsyncTask 访问服务器
Activity /** * 测试使用三种方式(AsyncHttpClient.httpURLCon.httpClient)分别以get和post方式访问服务器 * @author 白乾涛 */ ...
- C#。4 数组
一.跳出循环的俩个关键字 1.break与continue. 这两个关键字一般放在循环的花括号里面使用.break——结束整个循环.continue——结束本次循环,进入下次循环. br ...
- (转)反射发送实战(-)InvokeMember
反射是.net中的高级功能之一,利用反射可以实现许多以前看来匪夷所思的功能,下面是我看了<Programming C#>(O'Reilly)之后对于反射的一点实践,本想直接做个应用程序来说 ...