【问题标题】:How to scroll line numbers in a QTextEdit如何在 QTextEdit 中滚动行号
【发布时间】:2016-01-24 11:10:03
【问题描述】:

这是我的代码:

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 出现数字,添加新行时数字会更新。但是当它到达小部件的末尾时,文本在输入时继续滚动,但行号停止更新,并且行号区域没有任何滚动!

【问题讨论】:

    标签: python qt scroll pyside qtextedit


    【解决方案1】:

    希望这能解决您的问题!
    每次向下滚动文本时,我都会简单地调用parent().update()。我在第一条可见线开始 lineNumeration (line=block in 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()
    

    【讨论】:

      猜你喜欢
      • 2021-07-30
      • 1970-01-01
      • 2018-11-15
      • 1970-01-01
      • 2018-04-11
      • 2012-10-08
      • 2020-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多