分页控件效果图
一、环境要求
python解释器:python3.7.4
依赖:PyQt5、sys模块
二、思路分析
1、布局:”上一页“、”下一页“等button、edit及label控件采用水平布局,使用该布局填充主控件QWidget
2、类继承关系:主界面继承自QWidget,然后把button、edit、label等控件作为成员变量,实现自定义的Widget
3、类接口分析:自定义的控件提供属性接口,方便多种类对象之间的交互
三、代码实现步骤
1、定义一个新的控件,继承自QWidget
2、新控件界面的实现:使用QHBoxLayout容器,依次添加效果图所示的控件(也就是QPushButton、QLabel、QLineEdit等),并设置这些控件的文本属性
3、校验:为当前页数,总过页数及跳转页数添加校验(永远不要相信用户的输入),当前页数至少为1,且不能大于总的页数,跳转的页数只能在1到总的页数之间,且输入框只能输入整数
4、添加事件响应
四、代码展示
from PyQt5.QtWidgets import (QWidget,QHBoxLayout,QPushButton,QLabel,QLineEdit,QApplication)
from PyQt5.Qt import QIntValidator
import sys
'''
1、提供数据翻页显示接口
'''
class PageController(QWidget):
def __init__(self):
super().__init__()
self._init_ui()
def _init_ui(self):
control_layout = QHBoxLayout()
self.prePage = QPushButton("
self.curPage = QLabel("1")
self.nextPage = QPushButton("下一页>")
self.totalPage = QLabel("共 " + str(10) + " 页")
skipLable_0 = QLabel("跳到")
self.skipPage = QLineEdit()
self.skipPage.setPlaceholderText("请输入跳转的页码")
self.skipPage.setValidator(QIntValidator()) # 设置只能输入int类型的数据
skipLabel_1 = QLabel("页")
self.confirmSkip = QPushButton("确定")
control_layout.addStretch(1)
control_layout.addWidget(self.prePage)
control_layout.addWidget(self.curPage)
control_layout.addWidget(self.nextPage)
control_layout.addWidget(self.totalPage)
control_layout.addWidget(skipLable_0)
control_layout.addWidget(self.skipPage)
control_layout.addWidget(skipLabel_1)
control_layout.addWidget(self.confirmSkip)
control_layout.addStretch(1)
self.setLayout(control_layout)
self.setWindowTitle("分页控件demo")
self.prePage.clicked.connect(self.button_clicked)
self.nextPage.clicked.connect(self.button_clicked)
self.confirmSkip.clicked.connect(self.button_clicked)
def button_clicked(self):
button_text=self.sender().text()
total_page=int(self.totalPage.text().split()[1])
current_page=int(self.curPage.text())
if "
self.skipPage.setText('')
current_page=current_page-1
if current_page<=1:
self.curPage.setText('1')
else:
self.curPage.setText(str(current_page))
if "下一页>"==button_text:
self.skipPage.setText('')
current_page=current_page+1
if current_page<=total_page:
self.curPage.setText(str(current_page))
if "确定"==button_text:
if ''==self.skipPage.text():
return
page=int(self.skipPage.text())
if 1<=page<=total_page:
self.curPage.setText(str(page))
if page>total_page:
self.curPage.setText(str(total_page))
self.skipPage.setText(str(total_page))
if page<=0:
self.curPage.setText(str(1))
self.skipPage.setText(str(1))
@property
def PAGE(self):
return int(self.totalPage.text().split()[1])
@PAGE.setter
def PAGE(self,page:int):
if page<0:
return
self.totalPage.setText("共 " + str(page) + " 页")
if __name__=='__main__':
app=QApplication(sys.argv)
win=PageController()
win.show()
sys.exit(app.exec_())