如何用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
相关产品推荐
相关产品推荐

