• 第15.25节 PyQt(Python+Qt)入门学习:Model/View开发实战--使用QTableView展示Excel文件内容


    一、概述

    在前面的订阅专栏《第十九章、Model/View开发:QTableView的功能及属性》及公开博文《第15.24节 PyQt(Python+Qt)入门学习:Model/View架构中QTableView的作用及属性详解》中介绍了QTableView的主要功能及属性,本节来使用QTableView与QStandardItemModel配套来开发一个简单的Excel文件展示程序。之所以使用QStandardItemModel,这是因为在Model/View架构中,PyQt和Qt提供的已经可以直接使用的model模型类中,QStandardItemModel应该是最适合QTableView的模型。

    二、QStandardItemModel相关知识介绍

    下面介绍几个本节需要使用的QStandardItemModel的方法。

    2.1、项QStandardItem

    2.1.1、项的创建

    QStandardItemModel是一个多用途模型,可用于表示列表list、表table和树tree类型视图所需的各种不同数据结构,模型可以保存数据项。

    QStandardItemModel的项是QStandardItem类的实例对象,创建项的语法如下:

    • QStandardItem():创建一个无数据的空项,可以通过setData方法指定数据
    • QStandardItem(str text) :创建一个带数据text的项
    • QStandardItem(QIcon icon, str text):创建一个带图标和数据的项,即项可以在视图中同时展现图标和数据
    • QStandardItem(int rows, int columns = 1):创建包含rows行,columns列的项阵

    2.1.2、数据修改方法

    项创建以后可以使用setData方法修改数据项,包括修改数据、数据图标、数据复选状态以及数据的拖拽状态等。

    语法:setData( QVariant value, int role = Qt.UserRole + 1)
    

    QVariant 代表任何PyQt或Qt的类型,QVariant 构造方法使用任何类型的数据作为参数就可以转换为QVariant类型。

    关于role的取值在前面章节《第十四章、Model/View开发:Model/View架构程序设计模式》和《PyQt学习随笔:Model/View中诸如DisplayRole的数据角色及含义》进行了介绍,在此不重复介绍。

    2.2、QStandardItemModel构造方法

    QStandardItemModel的构造方法有2个,分别如下

    • QStandardItemModel(QObject parent = None):直接创建一个模型实例,数据未进行初始化
    • QStandardItemModel(int rows, int columns, QObject parent = None):直接创建一个模型实例,包含有rows行columns列的空项。这些项可以通过model的index方法获取后,通过QModelIndex的setData方法进行数据修改。当模型中存储实际数据少于指定的行或列时,多出部分显示空数据。

    2.3、setColumnCount方法

    setColumnCount设置模型中数据的列数为指定数目,如果模型本身的列数超过了设定数,则多出的列数被废弃。

    语法:QStandardItemModel.setColumnCount(int columns)
    

    2.4、setHeaderData方法

    setHeaderData方法设置模型中指定部分表头数据的内容。

    语法:bool QStandardItemModel.setHeaderData(int section, Qt.Orientation orientation,  QVariant value, int role = Qt.EditRole)
    

    2.5、setItem方法

    setItem是将model中指定行、列的项设置为参数指定的项。

    语法:setItem(int row, int column, QStandardItem item)
    

    注意该方法没有返回值。

    三、开发实战案例

    3.1、案例情况介绍

    本案例通过读取指定excel文件第一个sheet的数据,将数据的表头栏及数据在QTableView的视图中展示出来。除了用到Model、View相关的知识外,还会使用到老猿随笔介绍的Excel文件读取相关方法(相关内容请参考《Python学习随笔:使用xlwings读取和操作Execl文件》)。

    为了重点突出,在案例代码中没有进行退出处理、没有完整的异常处理,相关文件也是直接在代码中指定,未提供选择界面。

    3.2、案例开发步骤

    3.2.1、设计UI界面

    如图:
    在这里插入图片描述
    其中table view对象的名字就是tableView。

    3.2.2、在界面派生类中通过readExcel读取Excel中的数据存放到Model中

        def readExcel(self):
            excelApp = excelM.App(False, False)  #调用excel模块初始化功能
            excelFile = excelApp.books.open(r'c:	emp期中成绩.xls') #打开excel文件
            excelSheet = excelFile.sheets[0] #获取excel文件中第一个sheet
            rows,cols = excelSheet.used_range.last_cell.row, excelSheet.used_range.last_cell.column #获取数据的行数和列数
            self.excelModel = QStandardItemModel() 
            self.excelModel.setColumnCount(cols)  #设置model的列数
    
            for row in range(1, rows + 1):
                line = excelSheet.range(row, 1).expand('right').value #从excel中读取第row行整行数据
    
                if not line: continue
                if row==1:self.showHead(line) #设置表头
                else:self.showRecord(line,row-2) #展示数据行
            self.tableView.setModel(self.excelModel)
    

    方法showHead展示表头数据,就是将表头数据使用setHeaderData方法来设置,老猿只用了三行代码,具体实现大家可以自己动手。方法showRecord展示一行excel数据,主要使用setItem来创建项并指定存储行和列。
    示例代码:

                item = QStandardItem(data)
                self.excelModel.setItem(lineNO, col , item)
    

    3.2.3、在界面派生类构造方法中调用readExcel

    class w_mainWin(ui_tableView.Ui_mainWin,QtWidgets.QWidget):
        def __init__(self):
            super(w_mainWin, self).__init__()
            self.setupUi(self)
            self.readExcel()
    

    3.3、界面运行截图

    在这里插入图片描述

    广告

    老猿关于PyQt的付费专栏《使用PyQt开发图形界面Python应用》只需要9.9元,该部分与第十五章的内容基本对应,但同样内容在付费专栏上总体来说更详细、案例更多。本节内容对应付费专栏的《第二十章、QTableView与QStandardItemModel开发实战:展示Excel文件内容》。如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

    老猿Python,跟老猿学Python!

  • 相关阅读:
    wamp集成环境安装后无法启动的问题
    jquery点击内层的click事件时会触发外层的click事件
    js 控制文本框只能输入数字
    第七届飞思卡尔智能车比赛的赛道边缘提取第一篇博客
    多级菜单,多级下拉列表解决方案(收藏) 西安
    ASP.NET 从Excel文件导入数据到数据库(笔记) 西安
    动态构造地址栏参数 西安
    我觉得我应该要回来了 西安
    SQL Server 无法生成 FRunCM 线程。请查看 SQL Server 错误日志和 Windows 事件日志(转) 西安
    Web.Config 分析 西安
  • 原文地址:https://www.cnblogs.com/LaoYuanPython/p/12235058.html
Copyright © 2020-2023  润新知