如何自动滚动QT文本字段小部件
下面的代码创建了一个窗口,里面有一个叫做 QTextBrowser
的小部件。这个小部件会在五秒钟内不断添加新的文本行,使用的是它的 .insertPlainText()
方法。当文本填满整个区域时,QTextBrowser
会自动添加一个滚动条。不过,它并不会自动向下滚动,这样用户就看不到最后一行文本。
我想知道怎么让 QTextBrowser
自动向下滚动,这样最后一行文本就总是能在文本框内显示出来。该怎么做呢?
截图:

代码:
import sys, time
from PyQt4 import QtCore, QtGui
class MyDialog(QtGui.QDialog):
def __init__( self, parent = None ):
super(MyDialog, self).__init__(parent)
self._console = QtGui.QTextBrowser(self)
layout = QtGui.QVBoxLayout()
layout.addWidget(self._console)
self.setLayout(layout)
def updateField(self):
for m in range(5):
for n in range(100):
self._console.insertPlainText('%s : '%n)
QtGui.qApp.processEvents()
time.sleep(1)
if ( __name__ == '__main__' ):
app = None
if ( not QtGui.QApplication.instance() ):
app = QtGui.QApplication([])
dlg = MyDialog()
dlg.show()
dlg.updateField()
if ( app ): app.exec_()
2 个回答
1
因为 QTextBrowser
是从 QTextEdit
这个控件派生出来的,所以我们可以使用它的 .ensureCursorVisible()
方法。
为了让 QTextBrowser
在填充文本时自动向下滚动,我们只需要添加一行代码来启用这个功能的属性:
self._console.ensureCursorVisible()
下面是可以正常工作的代码示例:
import sys, time
from PyQt4 import QtCore, QtGui
class MyDialog(QtGui.QDialog):
def __init__( self, parent = None ):
super(MyDialog, self).__init__(parent)
self._console = QtGui.QTextBrowser(self)
self._console.ensureCursorVisible()
layout = QtGui.QVBoxLayout()
layout.addWidget(self._console)
self.setLayout(layout)
def updateField(self):
for m in range(5):
for n in range(100):
self._console.insertPlainText('%s : '%n)
QtGui.qApp.processEvents()
time.sleep(1)
if ( __name__ == '__main__' ):
app = None
if ( not QtGui.QApplication.instance() ):
app = QtGui.QApplication([])
dlg = MyDialog()
dlg.show()
dlg.updateField()
if ( app ): app.exec_()
3
只需使用 .append
,而不是 .insertPlainText
,这样可以确保自动滚动:
self._console.append('%s : '%n)