第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:\temp\期中成績.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!

發佈了623 篇原創文章 · 獲贊 3419 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章