from PyQt5.QtCore import pyqtSignal, QSize, Qt from PyQt5.QtWidgets import QWidget, QHBoxLayout, QToolButton, QLineEdit, QLabel class PaginationWidget(QWidget): pageChanged = pyqtSignal(int) def __init__(self, parent=None): QWidget.__init__(self, parent=parent) self.rows_per_page = 1000 self.page_count = 1 self.current_page = 1 self.init_ui() def init_ui(self): layout = QHBoxLayout(self) self.first_page_btn = QToolButton(self) self.first_page_btn.clicked.connect(self._on_first_page_btn_clicked) self.first_page_btn.setArrowType(Qt.LeftArrow) self.first_page_btn.setToolTip("First page") layout.addWidget(self.first_page_btn) self.prev_page_btn = QToolButton(self) self.prev_page_btn.clicked.connect(self._on_prev_page_btn_clicked) self.prev_page_btn.setArrowType(Qt.LeftArrow) self.prev_page_btn.setToolTip("Previous page") layout.addWidget(self.prev_page_btn) self.page_edit = QLineEdit("1") self.page_edit.setMaximumSize(45, 24) self.page_edit.returnPressed.connect( lambda: self.set_current_page(self.page_edit.text()) ) layout.addWidget(self.page_edit) self.next_page_btn = QToolButton(self) self.next_page_btn.clicked.connect(self._on_next_page_btn_clicked) self.next_page_btn.setArrowType(Qt.RightArrow) self.next_page_btn.setToolTip("Next page") layout.addWidget(self.next_page_btn) self.last_page_btn = QToolButton(self) self.last_page_btn.clicked.connect(self._on_last_page_btn_clicked) self.last_page_btn.setArrowType(Qt.RightArrow) self.last_page_btn.setToolTip("Last page") layout.addWidget(self.last_page_btn) self.status_label = QLabel("") layout.addWidget(self.status_label) def set_enabled(self, enabled): self.prev_page_btn.setEnabled(enabled) self.next_page_btn.setEnabled(enabled) self.last_page_btn.setEnabled(enabled) self.first_page_btn.setEnabled(enabled) self.status_label.setEnabled(enabled) self.page_edit.setEnabled(enabled) def update_status_text(self): status = f"Page: {self.current_page} / {self.page_count}" self.status_label.setText(status) def set_status_text(self, text): self.status_label.setText(text) def set_page_count(self, page_count): # if self.current_page > page_count: # self.set_current_page(page_count) self.page_count = page_count self.update_status_text() def set_current_page(self, page, block_signals=False): try: if not isinstance(page, int): page = int(page) except ValueError: print(f"Exception on set_current_page: page must be integer.") return if page < 1: page = 1 if page > self.page_count: page = self.page_count self.current_page = page self.page_edit.setText(str(page)) self.update_status_text() if not block_signals: self.pageChanged.emit(page) def _on_prev_page_btn_clicked(self): self.set_current_page(self.current_page - 1) def _on_next_page_btn_clicked(self): self.set_current_page(self.current_page + 1) def _on_first_page_btn_clicked(self): self.set_current_page(1) def _on_last_page_btn_clicked(self): self.set_current_page(self.page_count)