Python+PyQt5+Mysql(二)通过QSqlQueryModel实现QTableView分页显示,表头排序等功能

1.总体样式预览

功能说明:

1).分页显示列表功能包括:前后分页,指定页面跳转,设置单页显示条数

        2).点击标题栏实现列表内容排序功能(这个功能花了我很长时间,在全网就没找到合适的解决方法,要不是参考了Qt开发经验,采用了变通解决办法才最终得以解决)

2.开发实现部分说明

        1)界面设计:通过Qt Designer实现基本界面

                

        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下载 

猜你喜欢

转载自blog.csdn.net/gui818/article/details/124500424