PyQt5-组件控件-分页功能实现(四)

  • Post author:
  • Post category:其他



本文使用PyQt的版本为5.11.3,其他版本的兼容性测试

使用表格开发时,想加入一个页码选择操作的控件

有例子是利用滚动条,本文不涉及任何滚动条的利用。

UI界面与逻辑分离。



运行效果:


666

  # _*_ coding:utf-8 _*_
    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一样的使用了。

最后,希望本例子能帮到你!



版权声明:本文为qq_43030934原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。