I need to paginate data from SQL tables.
I cant find any information about pagination in PyQT or Pyside. Can you help me pls?
Advertisement
Answer
One way to handle pagination is to use the QStackedWidget
for emulating the pages themselves, and regular QLabel
s as the page links. Then you can override each labels mousePressEvent
to emit a signal to the stacked widget to set the current index to the page number from the label that was clicked.
Here is Minimal Reproducible Example using PySide6 that demonstrates the suggested strategy.
import sys from PySide6.QtWidgets import * from PySide6.QtCore import * from PySide6.QtGui import * class PageLink(QLabel): clicked = Signal([str]) # Signal emited when label is clicked def __init__(self, text, parent=None): super().__init__(text, parent=parent) self.setTextInteractionFlags(Qt.LinksAccessibleByMouse) self.setStyleSheet("color: blue;") # set text color to blue to emulate a link self.setCursor(Qt.PointingHandCursor) # set the cursor to link pointer def mousePressEvent(self, event): self.clicked.emit(self.text()) # emit the clicked signal when pressed return super().mousePressEvent(event) class MainWindow(QMainWindow): def __init__(self, parent=None) -> None: """Main Window Setup""" super().__init__(parent=parent) self.setWindowTitle("Pagination Demonstration") self.resize(600,400) self.central = QWidget(parent=self) self.layout = QVBoxLayout(self.central) self.setCentralWidget(self.central) # create the stacked widget that will contain each page... self.stackWidget = QStackedWidget(parent=self) self.layout.addWidget(self.stackWidget) # setup the layout for the page numbers below the stacked widget self.pagination_layout = QHBoxLayout() self.pagination_layout.addStretch(0) self.pagination_layout.addWidget(QLabel("<")) # create pages and corresponding labels for i in range(1, 6): page_link = PageLink(str(i), parent=self) self.pagination_layout.addWidget(page_link) page = QWidget() layout = QVBoxLayout(page) layout.addWidget(QLabel(f"This is page number {i} of 5")) self.stackWidget.addWidget(page) page_link.clicked.connect(self.switch_page) self.pagination_layout.addWidget(QLabel(">")) self.layout.addLayout(self.pagination_layout) def switch_page(self, page): self.stackWidget.setCurrentIndex(int(page) - 1) app = QApplication(sys.argv) window = MainWindow() window.show() app.exec()