Qt 模型视图框架解读之模型
Qt 模型視圖框架 前后閱讀的好幾遍,要不是項目中需要處理一些相對比較多的數據,這部分內容估計不會去急著去理解。
首先來了解下什么是模型和視圖框架吧:
一般地:MVC 設計模式包括三個元素:
-
表示數據的模型、
-
表示用戶界面的視圖
-
定義了用戶在界面上操作的控制器
Qt引入InterView框架,把視圖和控制器部件結合在一起,使得框架更為簡潔。為了靈活處理用戶輸入,InterView引入了代理(delegatr)。
Qt中模型、視圖、代理的三者關系如下:
- 數據發生改變時,模型發出信號通知視圖。
- 用戶對界面進行操作,視圖發出信號。
- 代理發出信號告知模型和視圖編輯器目前的狀態。
1、模型類
在模型、視圖架構中,模型提供了一個標準的接口供視圖和委托來訪問數據。在Qt中,這個標準的接口使用QAbstractItemModel類來定義。
這里有三個要點:
1、無論數據項是怎樣存儲在何種底層數據結構中,QAbstractItemModel的子類都會以層次結構來表示數據。
2、視圖按照約定來訪問模型中的數據項,視圖可以使用任何形式將數據顯示出來。
3、當模型中的數據發生變化時,模型會通過信號和槽機制告知與其關聯的視圖。
三種常見的模型:列表、表格、樹模型
基本概念:
1、模型索引
為了確保數據的表示與數據的獲取相分離,Qt引入了模型索引的概念。視圖和委托都使用索引來請求數據項并顯示。
2、行和列
如果要獲得一個數據項的模型索引,必須指定模型的3個屬性:行號、列號、模型索引。
在最基本的形式中,一個模型可以通過把它看做一個簡單的表格來訪問,每個數據項可以使用行號和列號來定位。
3、父項
在獲取數據項的索引時,父項的模型索引可以用QModelIndex()表示。
4、項角色
模型中的數據項可以作為各種角色在其他組件中訪問,允許不同的情況提供不同類型的數據。
這些概念一開始接觸非常不好理解《QtCreator 快速入門》一書中有實例可以幫助理解:
實例的效果:
實例中是一個簡單的樹狀顯示
接著看下代碼
#include <QApplication> #include <QTreeView> #include <QDebug> #include <QStandardItemModel>int main(int argc, char *argv[]) {QApplication app(argc, argv);// 創建標準項模型QStandardItemModel model;// 獲取模型的根項(Root Item),根項是不可見的QStandardItem *parentItem = model.invisibleRootItem();// 創建標準項item0,并設置顯示文本,圖標和工具提示QStandardItem *item0 = new QStandardItem;item0->setText("A");QPixmap pixmap0(50,50);pixmap0.fill("red");item0->setIcon(QIcon(pixmap0));item0->setToolTip("indexA");// 將創建的標準項作為根項的子項parentItem->appendRow(item0);// 將創建的標準項作為新的父項parentItem = item0;// 創建新的標準項,它將作為item0的子項QStandardItem *item1 = new QStandardItem;item1->setText("B");QPixmap pixmap1(50,50);pixmap1.fill("blue");item1->setIcon(QIcon(pixmap1));item1->setToolTip("indexB");parentItem->appendRow(item1);// 創建新的標準項,這里使用了另一種方法來設置文本、圖標和工具提示QStandardItem *item2 = new QStandardItem;QPixmap pixmap2(50,50);pixmap2.fill("green");item2->setData("C", Qt::EditRole);item2->setData("indexC", Qt::ToolTipRole);item2->setData(QIcon(pixmap2), Qt::DecorationRole);parentItem->appendRow(item2);// 在樹視圖中顯示模型QTreeView view;view.setModel(&model);view.show();// 獲取item0的索引并輸出item0的子項數目,然后輸出了item1的顯示文本和工具提示QModelIndex indexA = model.index(0, 0, QModelIndex());qDebug() << "indexA row count: " << model.rowCount(indexA);QModelIndex indexB = model.index(0, 0, indexA);qDebug() << "indexB text: " << model.data(indexB, Qt::EditRole).toString();qDebug() << "indexB toolTip: " << model.data(indexB, Qt::ToolTipRole).toString();return app.exec(); }代碼的注釋很明確:這里用標準模型項類實現的三個項,然后用樹狀視圖顯示,并且通過模型索引來訪問數據項。
這里我們注釋
// parentItem = item0;
并且添加QTableView視圖;
QTableView viewtable;
viewtable.setModel(&model);
viewtable.show();
重新構建
這時候彈出兩個視圖:
到這里,關于父項,行、列、索引、項目角色這些概念應該可以搞清楚了。
總結
以上是生活随笔為你收集整理的Qt 模型视图框架解读之模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt MVC编程之table view
- 下一篇: Qt 可编辑的树模型(Tree Mode