本文使用PyQt的版本为5.11.3,其他版本的兼容性测试
使用表格开发时,想加入一个页码选择操作的控件
有例子是利用滚动条,本文不涉及任何滚动条的利用。
UI界面与逻辑分离。
运行效果:
# _*_ 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一样的使用了。
最后,希望本例子能帮到你!