引言
Python/ target=_blank class=infotextkey>Python是一種面向對象的高級動態編程語言,相比于其它如C/C++語言,具有上手快、代碼少、開發效率高的特點,Qt是跨平臺的C++圖形用戶界面應用程序開發框架,是當前主流的GUI開發工具之一,其在Python下的綁定是PyQt庫。使用“Python+PyQt”架構編寫應用軟件,可以做到在兼顧軟件運行效率的前提下,大大節省時間成本,加快項目的開發進度。
在Qt界面庫中,Model/View即模型/視圖結構可將界面組件與數據進行分離,是處理數據與界面的一種較好的方法。其中,視圖(View)是顯示和編輯數據的界面組件,模型(Model)是視圖與原始數據的接口。由于數據源與顯示界面通過Model/View結構分離開來,因此可將一個數據模型在不同的視圖中顯示,也可在不修改數據模型的前提下,設計特殊的視圖組件。
在Qt中,提供了一些常用的視圖組件如QListView、QTreeView、QTableView等,也提供了多種預定義的數據模型,如QStringListModel、QFileSystemModel、QStandItemModel等。
其中,QStringListModel是一種比較簡單的用于處理字符串列表的數據模型,它可作為QListView視圖組件的數據模型,在界面上顯示和編輯字符串列表。下面給出一個在Python語言下使用PyQt界面庫,將QStingListModel數據模型結合QListView視圖組件進行數據編輯及顯示的例子。
示例說明
該例使用QStringListModel作為數據模型,QListView作為視圖組件,演示這種Model/View視圖結構編輯字符串列表的功能,示例運行界面如下圖所示:
在主界面上,窗口左側包括了對QStringListModel的一些操作按鈕及QListView視圖組件,右側QPlainTextEdit中可以顯示當前QStringListModel中的內容,以便查看其是否與界面上ListView視圖組件上顯示的內容一致。最下面一行使用Label控件顯示QListView視圖組件上當前選中項的行、列信息。
界面設計
界面部分使用設計師設計,關于設計師設計界面的步驟可查看以前的文章,使用設計師編寫界面程序入門示例。本例保存為“Main.ui”,完成后界面(左邊)及窗口中涉及到的所有界面對象元素的布局情況(右邊)如下圖所示:
主窗口實現代碼
主窗口類MainWnd主要實現代碼如下圖所示:
其主要代碼解釋如下:
(1)第21-27行,初始化函數。其中,使用QStringListModel類創建一個數據模型實例,使用setStringList函數將一個字符串列表的內容作為數據模型的初始數據內容,使用setModel函數完成數據模型與視圖組件的關聯,使用setEditTriggers函數設置視圖組件的條目是否可以編輯以及如何進入編輯狀態,本例設置為雙擊或選擇單擊列表項后就進入編輯狀態。最后進行了信號與槽函數的關聯。
(2)第40-44行,添加項槽函數,在列表的最后一行添加一行新內容“new item”。
(3)第46-50行,插入項槽函數,在列表當前行的前面行添加一行新內容“inserted item”。
(4)第52-54行,刪除當前項槽函數,使用removeRow函數刪除當前行所在的項。
(5)第56-57行,刪除列表所有項槽函數,使用removeRows函數刪除整個列表項。
(6)第59-60行,重新初始化列表內容。
(7)第62-63行,當單擊視圖組件時,其clicked()信號會傳遞一個QModelIndex類型的參數,利用該參數,在界面下方顯示當前列表項的模型索引的行和列信息。
(8)第65-66行,清空主界面右邊QPlainTextEdit的內容。
(9)第68-72行,通過數據模型的stringList函獲取字符串列表,并在QPlainTextEdit里逐行顯示。程序運行時,無論對ListView作了何種編輯和修改,當單擊“顯示數據模型列表”按鈕時,在這兒顯示的內容應該與ListView里總是完全相同的,即數據模型里面的數據與界面上顯示的內容始終是同步的。
完整測試代碼
程序完整測試代碼如下圖所示:
運行后就會出現本文開頭所示的軟件界面。
總結
本文給出了在Python+PyQt架構下,關于Model/View即模型/視圖結構,最簡單的一個QStingListModel數據模型與QListView視圖組件相結合進行數據編輯及顯示的例子。從這兒可以看出,在Model/View結構中,數據模型與視圖組件完全是分離的,可以直接操作數據模型以修改數據,同時,在視圖組件中作的修改也會自動保存到數據模型里。