python - 如何使用 QTableWidget PageUp/PageDown 表格?

标签 python python-3.x pyqt pyqt5 qtablewidget

我正在使用 QTableWidget,我已经设置了 100 行和 2 列,现在我需要使用 pageup 和 pagedown 按钮来滚动表格。

我正在尝试使用 PageUp/PageDown 按钮浏览表格,但按钮转到首页或结束表格。我想知道是否有一种方法可以部分滚动列表?

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):
        self.table_widget.scrollToTop()

    def btn_page_down(self):
        self.table_widget.scrollToBottom()


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

我希望使用 PageUp/PageDown 按钮浏览所有表格项目。

最佳答案

虽然 answer @eyllanesc 提供的工作正常,我想建议另一种方法。
即使滚动条被隐藏,它们仍然存在并根据项目 View 内容和位置不断更新,使得使用它们滚动成为可能,因为它们的 valueChanged 信号仍然连接到项目查看自身。

def btn_page_up(self):
    scrollBar = self.table_widget.verticalScrollBar()
    scrollBar.setValue(scrollBar.value() - scrollBar.pageStep())

def btn_page_down(self):
    scrollBar = self.table_widget.verticalScrollBar()
    scrollBar.setValue(scrollBar.value() + scrollBar.pageStep())

只要你使用ScrollPerItem verticalScrollMode 的模式,您甚至还可以滚动特定数量的项目。
例如,如果您想每次向下滚动 10 个项目:

def btn_scroll_down(self):
    scrollBar = self.table_widget.verticalScrollBar()
    scrollBar.setValue(scrollBar.value() + scrollBar.singleStep() * 10)

如果您使用 ScrollPerPixel,问题就来了,因为项目可以有不同的大小;因此,如果您想使用翻页键按项目滚动,您需要找到自己的方法(因为没有“完美”的方法)来根据当前显示的项目及其大小进行滚动。如果是这种情况,您应该使用 eyllanesc 提供的代码来实现它,同时检查项目定位(并确保可能显示的项目是否接近尾部)。

关于python - 如何使用 QTableWidget PageUp/PageDown 表格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57272759/

相关文章:

python - 用于多处理的共享内存中的大型 numpy 数组 : Is something wrong with this approach?

python - 如何将二进制字符串转为字节?

python - 在 spacy 中深度复制 PhraseMatcher 对象不起作用

python - 如何使用 QToolButton 或 QPushButton 将本地保存的 GeoJSON 加载到带有 QTableWidget 或 QTableTree 的 Qt 对话框中?

python - 从布局中删除所有项目

Python PyQt5 QTreeWidget 子项

python - 从小部件调用主窗口中的函数 (PySide)

python - sqlalchemy 按具有多个关系引用的模型进行过滤

python-3.x - Python/Pygame - 获取一个正方形以通过类改变颜色

python - 使用 Python/Pandas 按 csv 中的开始时间和结束时间日期时间列按小时分组