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

时间:2014-06-28 20:09:39

标签: python pyqt

下面的代码会创建一个包含QTextBrowser小部件的窗口。 使用时,新的文本行添加到QTextBrowser五秒钟 它的.insertPlainText()方法。 只要文本填充整个字段QTextBrowser,就会自动添加滚动条。但它没有向下滚动,因此用户始终可以看到(或可读)文本的最后一行。

我想知道如何让QTestBrowser自动向下滚动,以便文本的最后一行始终在其文本字段内或可见。如何实现呢?

截图: 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 个答案:

答案 0 :(得分:3)

只需使用.append代替.insertPlainText即可确保自动滚动:

    self._console.append('%s : '%n)

答案 1 :(得分:1)

由于QTextBrowserQTextEdit小部件的子类,我们可以使用其.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_()