`
wtx358
  • 浏览: 26107 次
  • 性别: Icon_minigender_1
  • 来自: 广西
社区版块
存档分类
最新评论

CodeEditor(PyQt4)

阅读更多
#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from highlighter import MyHighlighter
from highlighter import HighlightingRule

class CodeEditor(QPlainTextEdit):
    def __init__(self, parent = None):
        QPlainTextEdit.__init__(self, parent)
        self.lineNumberArea = LineNumberArea(self)
        
        self.connect(self, SIGNAL('blockCountChanged(int)'), \
                     self.updateLineNumberAreaWidth)
        self.connect(self, SIGNAL('updateRequest(const QRect &, int)'), \
                     self.updateLineNumberArea)
        self.connect(self, SIGNAL('cursorPositionChanged()'), \
                     self.highlightCurrentLine)
        
        self.updateLineNumberAreaWidth(0)
        self.highlightCurrentLine()
    def highlightCurrentLine(self):
        extraSelections = QTextEdit.extraSelections(QTextEdit())
        if not self.isReadOnly():
            selection = QTextEdit.ExtraSelection()
            lineColor = QColor(Qt.yellow).lighter(160)
            selection.format.setBackground(lineColor)
            selection.format.setProperty(QTextFormat.FullWidthSelection, True)
            selection.cursor = self.textCursor()
            selection.cursor.clearSelection()
            extraSelections.append(selection)
        self.setExtraSelections(extraSelections)
    def lineNumberAreaWidth(self):
        digits = 1
        Max = max(1, self.blockCount())
        while (Max >= 10) :
            Max /= 10
            digits += 1
        space = 3 + self.fontMetrics().width('9') * digits 
        return space
    def updateLineNumberAreaWidth(self, newBlockCount):
        self.setViewportMargins(self.lineNumberAreaWidth(), 0, 0, 0)
    def updateLineNumberArea(self, rect, dy):
        if dy:
            self.lineNumberArea.scroll(0, dy)
        else:
            self.lineNumberArea.update(0, rect.y(), \
                                       self.lineNumberAreaWidth(), \
                                       rect.height())
        if (rect.contains(self.viewport().rect())):
            self.updateLineNumberAreaWidth(0)
    def resizeEvent(self, e):
        QPlainTextEdit.resizeEvent(self, e)
        cr = self.contentsRect()
        self.lineNumberArea.setGeometry(QRect(cr.left(), cr.top(), \
                                              self.lineNumberAreaWidth(), \
                                              cr.height()))
    def lineNumberAreaPaintEvent(self, event):
        painter = QPainter(self.lineNumberArea)
        rect = event.rect()
        painter.fillRect(rect, Qt.lightGray)
        block = self.firstVisibleBlock()
        blockNumber = block.blockNumber()
        top = int(self.blockBoundingGeometry(block).translated(\
            self.contentOffset()).top())
        bottom = top + int(self.blockBoundingRect(block).height())
        while (block.isValid() and top <= rect.bottom()):
            if (block.isVisible() and bottom >= rect.top()):
                number = QString.number(blockNumber + 1)
                painter.setPen(Qt.black)
                painter.drawText(0, top, self.lineNumberArea.width(), \
                                 self.fontMetrics().height(), \
                                 Qt.AlignRight, number)
            block = block.next()
            top = bottom
            bottom = top + int(self.blockBoundingRect(block).height())
            blockNumber += 1

class LineNumberArea(QWidget):
    def __init__(self, editor):
        QWidget.__init__(self, editor)
        self.codeEditor = editor
    def sizeHint(self):
        return QSize(codeEditor.lineNumberAreaWidth(), 0)
    def paintEvent(self, event):
        self.codeEditor.lineNumberAreaPaintEvent(event)

def main():
    app = QApplication(sys.argv)
    editor = CodeEditor()
    editor.setWindowTitle('Code Editor Example')
    editor.show()
    app.exec_()
    
if __name__ == '__main__':
    main()

分享到:
评论

相关推荐

    windows下安装pyqt4

    ### Windows下安装PyQt4详解 #### 一、前言 在Windows环境下安装PyQt4是许多使用Python进行GUI开发的开发者必须掌握的基本技能之一。本文将详细介绍如何在Windows操作系统中顺利安装PyQt4,并通过实际操作验证安装...

    pyqt4 源代码 Linux, Windows详情看链接

    PyQt4是Python编程语言中一个非常重要的图形用户界面(GUI)工具包,它是Qt库的一个Python绑定。这个工具包允许开发者使用Python语言创建出功能丰富的桌面应用。本资源提供了PyQT4在Linux和Windows平台上的源代码,...

    PyQt4 examples 代码

    PyQt4的例子代码是学习和理解这个库功能的关键资源,因为它包含了一系列的示例程序,覆盖了PyQt4中的各种组件和功能。 这些例子源码可以帮助开发者直观地了解如何使用PyQt4的各种部件,如按钮、文本框、菜单、...

    PyQt4-4.11.4-cp27-cp27m-win32

    **PyQt4 框架详解** PyQt4 是一个 Python 模块,它提供了对 Qt 库的接口,使得 Python 开发者可以利用 Qt 的强大功能构建图形用户界面(GUI)应用程序。Qt 库是跨平台的 C++ 库,广泛应用于桌面、移动和嵌入式设备...

    PyQt4 精彩实例分析+PyQt4入门指南+零基础学QT4编程 pdf

    PyQt4是一款强大的Python图形用户界面工具包,它基于Qt库,使得开发者能够用Python语言构建功能丰富的桌面应用。这个压缩包包含三份珍贵的学习资源,分别是“PyQt4精彩实例分析”、“PyQt4入门指南”以及“零基础学...

    安装包PyQt4-4.11.4-cp27-cp27m-win_amd64.7z

    PyQt4是一个强大的Python绑定库,它允许Python程序员利用Qt应用程序框架和库。这个特定的安装包是"PyQt4-4.11.4-cp27-cp27m-win_amd64.7z",适用于Python 2.7版本且是64位的Windows操作系统。这个版本的PyQt4是...

    PyQt4入门指南

    ### PyQt4工具包知识点详解 #### 1. PyQt4简介 - **定义**: PyQt4是一个用于创建GUI(图形用户界面)应用程序的工具包。它结合了Python编程语言和强大的Qt库,后者是世界上最优秀的GUI库之一。 - **官方网址**: ...

    PyQt4-4.11.4-cp27-cp27m-win_amd64

    PyQt4是一个强大的Python绑定库,它为Python程序员提供了对Qt库的访问,Qt库是Qt公司开发的一个跨平台的应用程序开发框架。标题中的"PyQt4-4.11.4-cp27-cp27m-win_amd64"表明这是针对Python 2.7版本、采用CPython...

    PYQT4 安装包

    PYQT4是一个强大的Python库,用于创建图形用户界面(GUI)应用程序。它是Qt库的Python绑定,由Trolltech(现为The Qt Company)开发,提供了丰富的组件和功能,使得开发者能够轻松地构建桌面应用。在Python 2.7及更...

    Pyqt4+Eric4_均为64位

    **PyQt4与Eric4简介** PyQt4是一款强大的Python绑定库,它是Qt库的Python版本,由英国的Riverbank Computing公司开发并维护。Qt库是C++编写的一个跨平台的应用程序开发框架,广泛用于创建桌面和移动应用程序,支持...

    PyQt4 入门教程

    **PyQt4 入门教程概述** PyQt4 是一个基于 Python 的图形用户界面(GUI)工具包,它使得 Python 开发者能够利用 Qt 库创建功能丰富的桌面应用程序。Qt 库是由 Qt Company 开发的,它是一个跨平台的 C++ 库,支持 ...

    PyQt4 Model View Tutorial 源代码

    PyQt4是一个强大的Python绑定库,它为Qt应用程序框架提供了接口。这个库使得开发者能够用Python语言编写出具有丰富的用户界面的应用程序。在PyQt4中,Model/View编程模式是一个核心概念,它分离了数据的逻辑表示和其...

    PyQt4_gpl_win 4.12.3

    PyQt4是一个强大的Python绑定库,它将Qt应用程序框架与Python编程语言紧密集成。这个"PyQt4_gpl_win 4.12.3"版本是针对Windows平台的,并且遵循GNU General Public License (GPL)。它不是直接的可执行安装包,而是...

    PyQt4-4.11.4-gpl-Py2.7-Qt4.8.7-x32

    PyQt4是一个强大的工具包,它允许Python程序员利用Qt库创建功能丰富的图形用户界面(GUI)应用程序。这个压缩包“PyQt4-4.11.4-gpl-Py2.7-Qt4.8.7-x32”是专门为在32位系统上运行Python 2.7设计的PyQt4版本,版本号...

    PyQt5和PyQt4简介

    PyQt5和PyQt4差别中文版预览,值得关注

    PyQt4-4.11.4-cp37-cp37m-win_amd64.zip

    标题中的"PyQt4-4.11.4-cp37-cp37m-win_amd64.zip"指的是一个Python的GUI库PyQt4的特定版本,用于64位的Windows操作系统。这个版本是4.11.4,且已适配Python 3.7(表示为cp37)。"cp37m"代表的是Python的编译器标识...

    PyQt4_py2.7_x64_jb51

    标题“PyQt4_py2.7_x64_jb51”指的是一个针对Python 2.7和64位操作系统的PyQt4安装包。PyQt4是Python编程语言的一个模块,它允许开发者使用Qt库来创建图形用户界面(GUI)应用程序。这个版本的PyQt4是基于GPL许可的...

    PyQt4学习教程

    ### PyQt4 学习教程知识点概述 #### 一、PyQt4简介 - **定义**:PyQt4是一款用于创建图形用户界面(GUI)的应用程序工具包,它将Python与强大的Qt库结合在一起。Qt库因其强大而广受赞誉,被认为是在地球上最强大的...

    PyQt4 实例分析

    在Python的GUI编程中,PyQt4是一个非常重要的库,它提供了丰富的功能,使得开发者能够构建功能强大的桌面应用程序。PyQt4是Python绑定到Qt库的版本,Qt库本身是用C++编写的,但通过PyQt4,我们可以用Python语言来...

    PyQt4-4.11.4-cp27win32

    **PyQt4 框架详解** PyQt4 是一个 Python 模块,它使得 Python 程序员能够利用 Qt 库进行图形用户界面(GUI)编程。Qt 是一个跨平台的应用程序开发框架,由 C++ 编写,而 PyQt4 则是将 Qt 库与 Python 语言相结合的...

Global site tag (gtag.js) - Google Analytics