如何自动滚动QT文本字段小部件

0 投票
2 回答
4829 浏览
提问于 2025-04-18 11:26

下面的代码创建了一个窗口,里面有一个叫做 QTextBrowser 的小部件。这个小部件会在五秒钟内不断添加新的文本行,使用的是它的 .insertPlainText() 方法。当文本填满整个区域时,QTextBrowser 会自动添加一个滚动条。不过,它并不会自动向下滚动,这样用户就看不到最后一行文本。

我想知道怎么让 QTextBrowser 自动向下滚动,这样最后一行文本就总是能在文本框内显示出来。该怎么做呢?

截图:

enter image description here

代码:

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)

撰写回答