1.总体样式预览
功能说明:
1).分页显示列表功能包括:前后分页,指定页面跳转,设置单页显示条数
2).点击标题栏实现列表内容排序功能(这个功能花了我很长时间,在全网就没找到合适的解决方法,要不是参考了Qt开发经验,采用了变通解决办法才最终得以解决)
2.开发实现部分说明
1)界面设计:通过Qt Designer实现基本界面
扫描二维码关注公众号,回复:
14640211 查看本文章
2)将界面文件及资源文件通过转码得到tableview_ui.py,tableview_rc.py
3)执行文件tableview_mysql_do.py部分代码如下:
页面初始化部分代码:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
' a Main using Ui file'
__author__ = 'TianJiang Gui'
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QFileDialog, QMessageBox,QComboBox, QCompleter, QLabel, QHeaderView
from PyQt5 import QtGui
from PyQt5.QtGui import QPalette, QBrush, QPixmap, QPainter
from tableview_ui import Ui_MainWin
from PyQt5.QtCore import *
from utils.util_Commons import *
from extendWidgets import ExtendedComboBox,ComboCheckBox
from PyQt5.QtSql import QSqlDatabase, QSqlQuery, QSqlTableModel, QSqlQueryModel
import pymysql
class MainDo(QWidget, Ui_MainWin):
def __init__(self):
QWidget.__init__(self)
Ui_MainWin.__init__(self)
#---gtj 初始化连接数据库
self.initConnDb()
# 当前页
self.currentPage = 0
# 总页数
self.totalPage = 0
# 总记录数
self.totalRecrodCount = 0
# 每页显示记录数
self.PageRecordCount = 5
self.initUi()
def initUi(self):
self.setupUi(self)
self.setWindowTitle("python+pyqt5+mysql 通过QSqlQueryModel实现QTableView 分页,表头排序")
self.setAutoFillBackground(True)
self.palette = QPalette()
self.palette.setBrush(QPalette.Background, QBrush(QPixmap("./bg.png").scaled( # 缩放背景图.
self.size(),Qt.IgnoreAspectRatio,Qt.SmoothTransformation)))
self.setPalette(self.palette)
#--------gtj 设置表格属性-------------------------------------------------
# 表格宽度的自适应调整
self.tableView.horizontalHeader().setStretchLastSection(True)
# self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
self.tableView.horizontalHeader().setSectionsClickable(True)
# ------gtj 隔行颜色设置
self.tableView.setAlternatingRowColors(True)
self.tableView.setStyleSheet("alternate-background-color: rgb(209, 209, 209)"
"; background-color: rgb(244, 244, 244);")
#-------gtj 支持表头排序功能
self.tableView.setSortingEnabled(True)
self.tableView.horizontalHeader().setStyleSheet(
"::section{background-color: pink; color: blue; font-weight: bold}")
self.tableView.verticalHeader().hide()
#----------------------------------------------------------------------------
# 无边框
# self.setWindowFlags(Qt.FramelessWindowHint)
#---gtj 设置窗口透明
# self.setAttribute(Qt.WA_TranslucentBackground)
#---gtj右下角的小拖拽
# self.setSizeGripEnabled(True)
# ---gtj实现引用qss功能
self.qss()
#---gtj实现最小化,关闭功能
# self.pushButton_min.clicked.connect(self.showMinimized)
# self.pushButton_quit.clicked.connect(self.close)
# 设置表格
self.setTableView()
# 信号槽连接
self.prevButton.clicked.connect(self.onPrevButtonClick)
self.nextButton.clicked.connect(self.onNextButtonClick)
self.switchPageButton.clicked.connect(self.onSwitchPageButtonClick)
# 以列表形式添加内容
self.pagerecordcount.addItems(['5','25','50','100','200','300'])
self.pagerecordcount.currentIndexChanged.connect(self.pagerecordcountChange)
# -------------------------------------------------------------------------
数据库连接部分代码:
def initConnDb(self):
try:
# global db
print(QSqlDatabase.drivers())
self.db = QSqlDatabase.addDatabase('QMYSQL')
self.db.setHostName('localhost')
self.db.setDatabaseName('test-python-student')
self.db.setUserName('user')
self.db.setPassword('123456')
if not self.db.open(): # 判断数据库是否打开
print(self.db.lastError().text()) # 打印操作数据库时出现的错误
return False
else:
print("连接成功")
except:
pass
return
页面跳转部分代码
# 前一页被按下
def onPrevButtonClick(self):
print('*** onPrevButtonClick')
limitIndex = (self.currentPage - 2) * self.PageRecordCount
self.recordQuery(limitIndex)
self.currentPage -= 1
self.updateStatus()
# 后一页被按下
def onNextButtonClick(self):
print('*** onNextButtonClick')
limitIndex = self.currentPage * self.PageRecordCount
self.recordQuery(limitIndex)
self.currentPage += 1
self.updateStatus()
# 转到页按钮被按下
def onSwitchPageButtonClick(self):
# 得到输入的字符串
szText = self.switchPageLineEdit.text()
# 得到页数
pageIndex = int(szText)
# 判断是否有指定页
if pageIndex > self.totalPage or pageIndex < 1:
QMessageBox.information(self, '提示', "没有指定的页面,重新输入")
return
# 得到查询起始行号
limitIndex = (pageIndex - 1) * self.PageRecordCount
# 记录查询
self.recordQuery(limitIndex)
# 设置当前页
self.currentPage = pageIndex
# 刷新状态
self.updateStatus()
最终项目文件:其中test_data_students.sql是测试数据,可将数据现行导入数据库中
项目工程文件下载地址:Python+PyQt5+Mysql通过QSqlQueryModel实现的QTableView分页显示,表头排序等功能-管理软件文档类资源-CSDN下载