2016-01-24 51 views
1

滚动行号,这里是我的代码:如何在一个QTextEdit

import sys 
from PySide.QtCore import * 
from PySide.QtGui import * 

class Editor(QPlainTextEdit): 
    def __init__(self, parent): 
     super(Editor, self).__init__() 
     self.setPlainText(u'apple, banana\norange\nblah blah\n\nOh yeah!....\n'*2) 
     self.setParent(parent) 

     self.setWordWrapMode(QTextOption.NoWrap) 
     self.setViewportMargins(50,0,0,0) 

     QObject.connect(self, SIGNAL("textChanged()"), self.repainting) 

    def repainting(self) : self.parent().update() 

class WinE(QMainWindow): 
    def __init__(self, font=QFont('Monospace', 12)): 
     super(WinE, self).__init__() 

     self.font = font 
     self.font.setFixedPitch(True) 

     self.ce = Editor(self) 
     self.ce.setFont(self.font) 

     self.setWindowTitle('Code Editor') 

     self.textr = QRect(3, 5, self.ce.childrenRect().x() -12, self.ce.childrenRect().height()) 

     self.setGeometry(QRect(800, 840, 351, 250)) 
     self.setCentralWidget(self.ce) 

     self.show() 

    def paintEvent(self, event): 

     qp = QPainter () 
     qp.begin  (self) 
     self.drawLiNums (qp) 
     qp.end   () 

    def drawLiNums(self, qp): 

     qp.setPen  (QColor(255, 255, 255)) 
     qp.setFont  (self.font) 
     qp.drawText  (self.textr, Qt.AlignRight, self.lineNumeration()) 

    def lineNumeration(self): 

     return ''.join([str(n+1) +'\n' for n in range(len(self.ce.toPlainText().splitlines(False)))]) 

def main(): 

    app = QApplication(sys.argv) 
    ex = WinE() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': main() 

Editor显示了号码,并增加新的生产线时的数字正在更新。但是当它到达小部件的末尾时,文本会在输入时继续滚动,但行号会停止更新,并且行号区域不会滚动!

回答

3

我希望这可以解决您的问题!
每当文本向下滚动时,我就简单地调用parent().update()。我开始lineNumeration在第一个可见行(行=在QT块)
最良好的祝愿,MRP :)

import sys 
from PySide.QtCore import * 
from PySide.QtGui import * 

class Editor(QPlainTextEdit): 
    def __init__(self, parent): 
     super(Editor, self).__init__() 
     self.setPlainText(u'apple, banana\norange\nblah blah\n\nOh yeah!....\n'*6) 
     self.setParent(parent) 

     self.setWordWrapMode(QTextOption.NoWrap) 
     self.setViewportMargins(50,0,0,0) 

     QObject.connect(self, SIGNAL("textChanged()"), self.repainting) 

    def repainting(self): 
     self.parent().update() 

    def scrollContentsBy(self, *args, **kwargs): 
     self.parent().update() 
     return QPlainTextEdit.scrollContentsBy(self, *args, **kwargs) 

class WinE(QMainWindow): 
    def __init__(self, font=QFont('Monospace', 12)): 
     super(WinE, self).__init__() 

     self.font = font 
     self.font.setFixedPitch(True) 

     self.ce = Editor(self) 
     self.ce.setFont(self.font) 

     self.setWindowTitle('Code Editor') 

     self.textr = QRect(3, 5, self.ce.childrenRect().x() -12, self.ce.childrenRect().height()) 

     self.setGeometry(QRect(800, 840, 351, 250)) 
     self.setCentralWidget(self.ce) 

     self.show() 

    def paintEvent(self, event): 

     qp = QPainter () 
     qp.begin  (self) 
     self.drawLiNums (qp) 
     qp.end   () 

    def drawLiNums(self, qp): 

     qp.setPen  (QColor(255, 255, 255)) 
     qp.setFont  (self.font) 
     qp.drawText  (self.textr, Qt.AlignRight, self.lineNumeration()) 

    def lineNumeration(self): 
     offset=self.ce.firstVisibleBlock().firstLineNumber() 
     return ''.join(str(i)+"\n" for i in range(offset+1, self.ce.blockCount()+1)) 

def main(): 

    app = QApplication(sys.argv) 
    ex = WinE() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': main() 
+0

太谢谢你了!问题解决了。祝福,愿力量与你同在......;) – Alex