I need to paginate data from SQL tables.
I cant find any information about pagination in PyQT or Pyside. Can you help me pls?
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()