- 編程改變生活:用PySide6/PyQt6創建GUI程序(進階篇·微課視頻版)
- 邢世通編著
- 1252字
- 2024-12-31 19:11:39
2.1 模型/視圖簡介
在PySide6中,基于模型/視圖的控件采用了數據與顯示相分離的技術。這種技術起源于Smalltalk的設計模式——Model/View/Controller(MVC,模型/視圖/控制器),一般應用在顯示界面的程序中。與前者不同,PySide6主要采用了Model/View/Delegate(模型/視圖/代理)框架,簡稱為Model/View框架。
2.1.1 Model/View/Delegate框架
在PySide6中,可以使用Model/View/Delegate框架技術來顯示、處理不同類型的數據。Model/View/Delegate框架如圖2-1所示。

圖2-1 Model/View/Delegate框架
在Model/View/Delegate框架中,使用數據模型(Model)從數據源(Data)中讀、寫數據,使用視圖控件(View)顯示數據模型中獲取的數據。如果用戶要編輯數據,則可以使用代理控件(Delegate)編輯或修改數據,并將修改后的數據傳遞給數據模型(Model),PySide6的視圖控件提供了默認的代理控件,例如QTableView中提供了QLineEdit編輯框,所以Model/View/Delegate可以簡寫為Model/View框架。
在PySide6中,數據模型、視圖控件、代理控件通過信號/槽機制進行通信。
2.1.2 數據模型Model
PySide6提供了多種類型的數據模型,如圖2-2所示。

圖2-2 PySide6中的數據模型
在實際編程中會根據不同的功能選擇不同類型的數據模型。PySide6提供的數據模型類的功能見表2-1。
表2-1 PySide6提供的數據模型類

本章將重點講述QAbstractItemModel、QStringListModel、QStandardItemModel、QFileSystemModel。
2.1.3 視圖控件View
視圖控件是用來顯示數據模型的顯示控件,PySide6提供了多種視圖控件,如圖2-3所示。
在實際編程中會根據不同的功能選擇不同類型的視圖控件。PySide6提供的視圖控件類的功能見表2-2。

圖2-3 PySide6中的視圖控件
表2-2 PySide6提供的視圖控件類

本章將重點介紹QListView、QTableView、QTreeView的應用。
2.1.4 代理控件Delegate
代理控件就是視圖控件上為編輯數據提供的臨時編輯器。例如當在QTableView控件上編輯一個單元格的數據時,默認提供一個QLineEdit編輯框。代理控件負責從數據模型獲取相應的數據,并顯示在編輯器里,修改數據后可以將數據保存到數據模型中。
在PySide6中,QAbstractItemDelegate類是所有代理控件類的基類,是一個抽象類,不能直接使用。其子類QStyledItemDelegate類是PySide6中視圖控件類的默認代理控件類,默認提供QLineEdit類作為編輯器。如果開發者使用QComboBox、QSpinBox作為代理控件,則要繼承QStyledItemDelegate類創建自定義代理控件類。
2.1.5 數據項索引QModelIndex
在數據模型Model中,數據存儲的基本單元為item,每個item都對應了唯一的索引值(QModelIndex)。
在PySide6中,使用QModelIndex類表示數據索引,每個數據索引都有3個屬性,分別為行、列、父索引。對于一維數據模型只會用到行,例如列表;對于二維數據模型會用到行和列,例如Table;對于三維數據模型會用到行、列、父索引,例如樹。這3種數據如圖2-4所示。

圖2-4 不同的數據類型
在PySide6中,QModelIndex類的常用方法見表2-3。
表2-3 QModelIndex類的常用方法

2.1.6 抽象數據模型QAbstractItemModel
在PySide6中,QAbstractItemModel類為其他數據模型類的基類,該類提供了數據模型與視圖控件的數據接口。QAbstractItemModel類是抽象類,不能直接使用。QAbstractItemModel類的方法被其子類繼承。
QAbstractItemModel類的常用方法見表2-4。
表2-4 QAbstractItemModel類的常用方法

續表

在PySide6中,Qt.ItemDataRole的枚舉值見表2-5。
表2-5 Qt.ItemDataRole的枚舉值

在PySide6中,QAbstractItemModel類的信號也會被其子類繼承。QAbstractItemModel類的信號見表2-6。
表2-6 QAbstractItemModel類的信號

2.1.7 典型應用
前面介紹了模型/視圖的基礎知識,下面將通過例題來演示如何使用模型/視圖來創建控件,并顯示數據。
【實例2-1】 創建一個窗口,該窗口包含1個QListView視圖控件,該視圖控件將數據模型設置為QStringListModel,代碼如下:

運行結果如圖2-5所示。

圖2-5 代碼demo1.py的運行結果
注意:與QListWidget、QTableWidget、QTreeWidget創建的控件相同,可以通過雙擊視圖控件的文本來修改內容。
- FuelPHP Application Development Blueprints
- Beginning Java Data Structures and Algorithms
- Visual Basic程序開發(學習筆記)
- 精通Python設計模式(第2版)
- Learning Node.js for .NET Developers
- C++ Fundamentals
- Python 3 數據分析與機器學習實戰
- 基于MATLAB的控制系統仿真及應用
- Building Clouds with Windows Azure Pack
- 讀故事學編程:Python王國歷險記
- 深度學習的數學:使用Python語言
- HTML5+CSS3+JavaScript案例實戰
- 米思齊實戰手冊:Arduino圖形化編程指南
- iOS程序員面試筆試真題與解析
- 數據可視化實戰:使用D3設計交互式圖表(第2版)