如何在 QTextEdit 中滚动行号
How to scroll line numbers in a 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
与数字一起出现,并且数字在添加新行时更新。但是当它到达小部件的末尾时,文本在键入时继续滚动,但行号停止更新,并且行号区域没有任何滚动!
希望这能解决您的问题!
每次向下滚动文本时,我只是调用 parent().update()
。然后我在第一条可见行开始了 lineNumeration(qt 中的 line=block)
最良好的祝愿,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()
这是我的代码:
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
与数字一起出现,并且数字在添加新行时更新。但是当它到达小部件的末尾时,文本在键入时继续滚动,但行号停止更新,并且行号区域没有任何滚动!
希望这能解决您的问题!
每次向下滚动文本时,我只是调用 parent().update()
。然后我在第一条可见行开始了 lineNumeration(qt 中的 line=block)
最良好的祝愿,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()