日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt 模型视图框架解读之模型

發布時間:2025/3/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 模型视图框架解读之模型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。