You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PageUp/PageDown实现QTableWidget的分页滚动?

QTableWidget实现PageUp/PageDown逐页滚动(部分滚动)

我明白你想要的是点击PageUp/PageDown按钮时,表格滚动一页的内容,而不是直接跳到顶端或底端。你之前用的scrollToTop()和scrollToBottom()确实会直接跳转,要实现逐页滚动,我们可以通过操作表格的垂直滚动条来实现——即使你隐藏了滚动条,它的对象依然存在并可以被控制。

修改后的完整代码

from PyQt5.QtWidgets import QVBoxLayout, QPushButton, QHBoxLayout, QApplication, QWidget, QTableWidget, QTableWidgetItem
import sys
from PyQt5.QtCore import Qt

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.title = "PyQt5 Tables"
        self.top = 100
        self.left = 100
        self.width = 500
        self.height = 400
        self.qtd_rows = 100
        self.table_widget = QTableWidget()
        self.init_window()

    def init_window(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.top, self.left, self.width, self.height)
        self.creating_tables()
        self.show()

    def creating_tables(self):
        self.table_widget = QTableWidget()
        self.table_widget.setAutoScroll(True)
        self.table_widget.setRowCount(self.qtd_rows)
        self.table_widget.setColumnCount(2)
        self.table_widget.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.table_widget.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        vbox = QVBoxLayout()
        for text, slot in (("PageUp", self.btn_page_up), ("PageDown", self.btn_page_down)):
            button = QPushButton(text)
            vbox.addWidget(button)
            button.clicked.connect(slot)
        for i in range(0, self.qtd_rows):
            self.table_widget.setItem(i, 0, QTableWidgetItem("Name_" + str(i)))
            self.table_widget.setItem(i, 1, QTableWidgetItem("Email"))
        vBoxLayout = QVBoxLayout()
        vBoxLayout.addWidget(self.table_widget)
        hBox = QHBoxLayout()
        hBox.addLayout(vBoxLayout)
        hBox.addLayout(vbox)
        self.setLayout(hBox)

    def btn_page_up(self):
        scroll_bar = self.table_widget.verticalScrollBar()
        # 计算新的滚动位置:当前位置减去一页步长,不小于0
        new_value = max(scroll_bar.value() - scroll_bar.pageStep(), 0)
        scroll_bar.setValue(new_value)

    def btn_page_down(self):
        scroll_bar = self.table_widget.verticalScrollBar()
        # 计算新的滚动位置:当前位置加上一页步长,不超过最大值
        new_value = min(scroll_bar.value() + scroll_bar.pageStep(), scroll_bar.maximum())
        scroll_bar.setValue(new_value)

App = QApplication(sys.argv)
window = Window()
sys.exit(App.exec())

关键修改说明

  • 我们通过self.table_widget.verticalScrollBar()获取表格的垂直滚动条对象,即使你设置了ScrollBarAlwaysOff隐藏它,这个对象依然能正常工作。
  • scroll_bar.pageStep()方法会返回滚动一页需要调整的数值,这个数值是根据表格当前可见区域高度自动计算的,正好对应一页的内容。
  • 用max()和min()做边界检查,确保滚动位置不会超出表格范围(不会小于0,也不会超过滚动条的最大值)。

这样修改后,点击PageUp和PageDown按钮时,表格就会逐页滚动,完美实现你想要的逐条浏览所有条目的需求啦!

内容的提问来源于stack exchange,提问作者Roger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:27:23