【问题标题】:Keep QTableView scrolling to the last row when the model is growing模型增长时保持 QTableView 滚动到最后一行
【发布时间】:2012-09-29 23:07:25
【问题描述】:

我在 pyqt 应用程序中有一个 QTableView。我不断地将行附加到基础模型。我想要的是不断滚动到最后一行的视图(这种行为称为“自动滚动”吗?)。但取而代之的是,视图根本不会(自动)滚动并停留在其位置。

我能否以某种方式启用这种自动滚动行为,还是需要编写代码来实现它?

干杯, 沃尔夫冈

【问题讨论】:

    标签: python qt pyqt qtableview autoscroll


    【解决方案1】:

    没有默认的自动滚动功能,但您可以获得相对简单的行为。当您插入/追加行时,您的模型将发出 rowsInserted。您可以连接到该信号并在您的视图上调用scrollToBottom

    虽然有一个问题。 View 需要自行调整,因为当rowsInserted 触发时,它不会立即将项目置于底部。在QTimer.singleShot 中调用scrollToBottom 可以解决这个问题,因为QTimer 将等到没有待处理的事件(例如视图更新)。

    假设模型存储为self.model,视图为self.view,它的外观如下:

    self.model.rowsInserted.connect(self.autoScroll)
    

    autoScroll 方法:

    def autoScroll(self):
        QtCore.QTimer.singleShot(0, self.view.scrollToBottom)
    

    或者,如果您不希望为此使用单独的方法:

    self.model.rowsInserted.connect(lambda: QtCore.QTimer.singleShot(0, self.view.scrollToBottom))
    

    【讨论】:

    • 好的,可以了,非常感谢。但是,也许您可​​以帮助我了解self.connect(self.statsModel, SIGNAL("rowsInserted()"), lambda: QTimer.singleShot(0, self.table.scrollToBottom))(不起作用)和self.statsModel.rowsInserted.connect(lambda: QTimer.singleShot(0, self.table.scrollToBottom)) 之间的区别,哪个起作用。根据您的解释,我的印象是我必须连接到模型的信号 rowsInserted 并使用 singleShot 计时器在我的视图上调用 scrollToBottom 。这不是我对第一个代码 sn-p 所做的吗?
    • @wollud1969:如果你要使用旧语法,你需要为信号提供正确的签名,rowsInserted 的签名是rowsInserted(QModelIndex, int, int) .但是,这就是new syntax 的魅力所在。你不需要关心它:)。
    • 明白!非常感谢,我将学习新的语法并相应地更改我在这个项目中的所有代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 2019-06-16
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 2020-12-29
    相关资源
    最近更新 更多