Search code examples
pythonpyqtpyqt5pysidepyside6

how to do a pagination bar in PyQT?


I need to paginate data from SQL tables.

I cant find any information about pagination in PyQT or Pyside. Can you help me pls?

like this


Solution

  • One way to handle pagination is to use the QStackedWidget for emulating the pages themselves, and regular QLabels 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()