PyQt5使用QTableWidget分页功能的实现

本文使用PyQt的版本为5.11.3,其他版本的兼容性测试
使用表格开发时,想加入一个页码选择操作的控件
有例子是利用滚动条,本文不涉及任何滚动条的利用。
UI界面与逻辑分离。
实例化MainWindow中加入table_widget,表格调用setPageController方法添加页码控制器
效果如下图所示:
在这里插入图片描述
在这里插入图片描述
并且带一个跳转的按钮。
完整代码,复制可直接运行

# _*_ coding:utf-8 _*_
# author: zizle
# date 22/04/2019
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import pyqtSignal


class TableWidget(QWidget):
    control_signal = pyqtSignal(list)

    def __init__(self, *args, **kwargs):
        super(TableWidget, self).__init__(*args, **kwargs)
        self.__init_ui()

    def __init_ui(self):
        style_sheet = """
            QTableWidget {
                border: none;
                background-color:rgb(240,240,240)
            }
            QPushButton{
                max-width: 18ex;
                max-height: 6ex;
                font-size: 11px;
            }
            QLineEdit{
                max-width: 30px
            }
        """
        self.table = QTableWidget(3, 5)  # 3 行 5 列的表格
        self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)  # 自适应宽度
        self.__layout = QVBoxLayout()
        self.__layout.addWidget(self.table)
        self.setLayout(self.__layout)
        self.setStyleSheet(style_sheet)

    def setPageController(self, page):
        """自定义页码控制器"""
        control_layout = QHBoxLayout()
        homePage = QPushButton("首页")
        prePage = QPushButton("<上一页")
        self.curPage = QLabel("1")
        nextPage = QPushButton("下一页>")
        finalPage = QPushButton("尾页")
        self.totalPage = QLabel("共" + str(page) + "页")
        skipLable_0 = QLabel("跳到")
        self.skipPage = QLineEdit()
        skipLabel_1 = QLabel("页")
        confirmSkip = QPushButton("确定")
        homePage.clicked.connect(self.__home_page)
        prePage.clicked.connect(self.__pre_page)
        nextPage.clicked.connect(self.__next_page)
        finalPage.clicked.connect(self.__final_page)
        confirmSkip.clicked.connect(self.__confirm_skip)
        control_layout.addStretch(1)
        control_layout.addWidget(homePage)
        control_layout.addWidget(prePage)
        control_layout.addWidget(self.curPage)
        control_layout.addWidget(nextPage)
        control_layout.addWidget(finalPage)
        control_layout.addWidget(self.totalPage)
        control_layout.addWidget(skipLable_0)
        control_layout.addWidget(self.skipPage)
        control_layout.addWidget(skipLabel_1)
        control_layout.addWidget(confirmSkip)
        control_layout.addStretch(1)
        self.__layout.addLayout(control_layout)

    def __home_page(self):
        """点击首页信号"""
        self.control_signal.emit(["home", self.curPage.text()])

    def __pre_page(self):
        """点击上一页信号"""
        self.control_signal.emit(["pre", self.curPage.text()])

    def __next_page(self):
        """点击下一页信号"""
        self.control_signal.emit(["next", self.curPage.text()])

    def __final_page(self):
        """尾页点击信号"""
        self.control_signal.emit(["final", self.curPage.text()])

    def __confirm_skip(self):
        """跳转页码确定"""
        self.control_signal.emit(["confirm", self.skipPage.text()])

    def showTotalPage(self):
        """返回当前总页数"""
        return int(self.totalPage.text()[1:-1])


class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.__init_ui()

    def __init_ui(self):
        self.resize(500, 250)
        self.setWindowTitle("QTableWidget加页码控制器")
        self.table_widget = TableWidget()  # 实例化表格
        self.table_widget.setPageController(10)  # 表格设置页码控制
        self.table_widget.control_signal.connect(self.page_controller)
        self.setCentralWidget(self.table_widget)
    
    def page_controller(self, signal):
        total_page = self.table_widget.showTotalPage()
        if "home" == signal[0]:
            self.table_widget.curPage.setText("1")
        elif "pre" == signal[0]:
            if 1 == int(signal[1]):
                QMessageBox.information(self, "提示", "已经是第一页了", QMessageBox.Yes)
                return
            self.table_widget.curPage.setText(str(int(signal[1]) - 1))
        elif "next" == signal[0]:
            if total_page == int(signal[1]):
                QMessageBox.information(self, "提示", "已经是最后一页了", QMessageBox.Yes)
                return
            self.table_widget.curPage.setText(str(int(signal[1]) + 1))
        elif "final" == signal[0]:
            self.table_widget.curPage.setText(str(total_page))
        elif "confirm" == signal[0]:
            if total_page < int(signal[1]) or int(signal[1]) < 0:
                QMessageBox.information(self, "提示", "跳转页码超出范围", QMessageBox.Yes)
                return
            self.table_widget.curPage.setText(signal[1])

        self.changeTableContent()  # 改变表格内容

    def changeTableContent(self):
        """根据当前页改变表格的内容"""
        cur_page = self.table_widget.curPage.text()
        pass


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

代码解释:
首先自定义一个MainWindow,继承QMainWindow
在这个MainWindow中实例化加入自定义的表格控件:self.table_widget
表格控件加入页码控制器:self.table_widget.setPageController(10) 参数为总页码数

MainWindow.page_controller(self, signal)函数是处理表格中页码控制器传出的信号(为了UI与逻辑分离,实际上也可在表格控件中直接点击事件处理

MainWindow.changeTableContent(self):函数是根据当前的页码处理表格显示的内容。

TableWidget.control_signal是为了分离UI界面与逻辑而设置的点击信号传出在主界面中处理。

注意:
此例中如果要对表格进行设置都需要使用窗口实例.table_widget获取到表格实例,再调用PyQt5的QTableWidget的方法,对表格进行设置。
解决方法:
可在自定义的表格控件中,实现所有的PyQt5.QWidgets.QTableWidget的方法。只需将函数名字设计成一样就可以,如:

def setHorizontalHeaderLabels(self, labels):
    """设置表格的横向标题"""
    self.table.setHorizontalHeaderLabels(labels)

这样实现方法后,就能像使用原来的QTableWidget一样的使用了。

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值