QTableWidget如何PageUp/PageDowntable?
How to PageUp/PageDown table with QTableWidget?
我正在使用 QTableWidget 我已经设置了 100 行和 2 列,现在我需要 table 使用 pageup 和 pagedown 按钮滚动。
我正在尝试使用 PageUp/PageDown 按钮浏览 table,但按钮转到首页或结束 table。请问有没有什么方法可以部分滚动列表?
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 个按钮浏览所有 table 个项目。
您可以使用 QModelIndex 使用的 scrollToItem()
method but there is a drawback: Not every grid has a QTableWidgetItem
associated because you could not move to those grids. Instead it is better to use the scrollTo()
方法,在这种情况下,每个网格都有一个关联的 QModelIndex。
另一方面,获取QModelIndex是纯几何的,为此使用了viewport()
and the indexAt()
方法的rect,然后获取了grid的行列,最后获取到使用该模型的下一个或上一个 QModelIndex。
def btn_up(self):
ix = self.table_widget.indexAt(self.table_widget.viewport().rect().topLeft())
previous_ix = self.table_widget.model().index(ix.row() - 1, ix.column())
self.table_widget.scrollTo(previous_ix)
def btn_down(self):
ix = self.table_widget.indexAt(self.table_widget.viewport().rect().bottomLeft())
next_ix = self.table_widget.model().index(ix.row() + 1, ix.column())
self.table_widget.scrollTo(next_ix)
虽然@eyllanesc 提供的 工作正常,但我想建议另一种方法。
即使滚动条被隐藏,它们仍然存在并根据项目视图的内容和位置不断更新,使得使用它们滚动成为可能,因为它们的 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 mode for verticalScrollMode,您甚至还可以滚动特定数量的项目。
例如,如果您想每次向下滚动 10 个项目:
def btn_scroll_down(self):
scrollBar = self.table_widget.verticalScrollBar()
scrollBar.setValue(scrollBar.value() + scrollBar.singleStep() * 10)
如果您使用 ScrollPerPixel,问题就会出现,因为项目可能有不同的大小;因此,如果您想使用翻页键按项目滚动,您需要找到自己的方法(因为没有 "perfect" 方法)来根据当前显示的项目及其大小进行滚动。如果是这种情况,您应该使用 eyllanesc 提供的代码来实现它,同时检查项目定位(并确保可能显示的项目是否接近尾部)。
我正在使用 QTableWidget 我已经设置了 100 行和 2 列,现在我需要 table 使用 pageup 和 pagedown 按钮滚动。
我正在尝试使用 PageUp/PageDown 按钮浏览 table,但按钮转到首页或结束 table。请问有没有什么方法可以部分滚动列表?
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 个按钮浏览所有 table 个项目。
您可以使用 QModelIndex 使用的 scrollToItem()
method but there is a drawback: Not every grid has a QTableWidgetItem
associated because you could not move to those grids. Instead it is better to use the scrollTo()
方法,在这种情况下,每个网格都有一个关联的 QModelIndex。
另一方面,获取QModelIndex是纯几何的,为此使用了viewport()
and the indexAt()
方法的rect,然后获取了grid的行列,最后获取到使用该模型的下一个或上一个 QModelIndex。
def btn_up(self):
ix = self.table_widget.indexAt(self.table_widget.viewport().rect().topLeft())
previous_ix = self.table_widget.model().index(ix.row() - 1, ix.column())
self.table_widget.scrollTo(previous_ix)
def btn_down(self):
ix = self.table_widget.indexAt(self.table_widget.viewport().rect().bottomLeft())
next_ix = self.table_widget.model().index(ix.row() + 1, ix.column())
self.table_widget.scrollTo(next_ix)
虽然@eyllanesc 提供的
即使滚动条被隐藏,它们仍然存在并根据项目视图的内容和位置不断更新,使得使用它们滚动成为可能,因为它们的 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 mode for verticalScrollMode,您甚至还可以滚动特定数量的项目。
例如,如果您想每次向下滚动 10 个项目:
def btn_scroll_down(self):
scrollBar = self.table_widget.verticalScrollBar()
scrollBar.setValue(scrollBar.value() + scrollBar.singleStep() * 10)
如果您使用 ScrollPerPixel,问题就会出现,因为项目可能有不同的大小;因此,如果您想使用翻页键按项目滚动,您需要找到自己的方法(因为没有 "perfect" 方法)来根据当前显示的项目及其大小进行滚动。如果是这种情况,您应该使用 eyllanesc 提供的代码来实现它,同时检查项目定位(并确保可能显示的项目是否接近尾部)。