概念

在model/view架构中,view从model中获得数据项然后显示给用户。数据显示的方式不必与model提供的表示方式相同,可以与底层存储数据项的数据结构完全不同。
内容与显式的分离是通过由QAbstractItemModel提供的标准模型接口,由QAsbstractItemview提供的标准视图接口共同实现的。普遍使用model index来表示数据项。view负责管理从model中读取的数据的外观布局。

它们自己可以去渲染每个数据项,也可以利用delegate来既处理渲染又进行编辑。
除了显示数据,views也处理数据项的导航,参与有关于数据项选择的部分功能。view也实现一些基本的用户接口特性,如上下文菜单与拖拽功能。view也为数据项提供了缺省的编程功能,也可搭配delegate实现更为特殊的定制编辑的需求。
一个view创建时必不需要model,但在它能显示一些真正有用的信息之前,必须提供一个model。view通过使用selections来跟踪用户选择的数据项。每个view可以维护单独使用的selections,也可以在多个views之间共享。有些views,如QTableView和QTreeView,除数据项之外也可显示标题(Headers),标题部分通过一个view来实现,QHeaderView。标题与view一样总是从相同的model中获取数据。从 model中获取数据的函数是QabstractItemModel::headerDate(),一般总是以表单的形式中显示标题信息。可以从QHeaderView子类化,以实现更为复杂的定制化需求。

使用现成的view


Qt提供了三个现成的view 类,它们能够以用户熟悉的方式显示model中的数据。QListView把model中的数据项以一个简单的列表的形式显示,或是以经典的图标视图的形式显示。QTreeView把model中的数据项作为具有层次结构的列表的形式显示,它允许以紧凑的深度嵌套的结构进行显示。QTableView却是把model中的数据项以表格的形式展现,更像是一个电子表格应用程序的外观布局。

以上这些标准view的行为足以应付大多数的应用程序,它们也提供了一些基本的编辑功能,也可以定制特殊的需求。

使用model

以前的例子中创建过一个string list model,可以给它设置一些数据,再创建一个view把model中的内容展示出来:
int main(int argc, char *argv[]) {

QApplication app(argc, argv);

// Unindented for quoting purposes:
   QStringList numbers;
numbers << "One" << "Two" << "Three" << "Four" << "Five";

QAbstractItemModel *model = new StringListModel(numbers);
   //要注意的是,这里把StringListModel作为一个QAbstractItemModel来使用。这样我们就可以
   //使用model中的抽象接口,而且如果将来我们用别的model代替了当前这个model,这些代码也会照样工 作。
//QListView提供的列表视图足以满足当前这个model的需要了。
   QListView *view = new QListView;
   view->setModel(model);
   view->show();

return app.exec();
}

view会渲染model中的内容,通过model的接口来访问它的数据。当用户试图编辑数据项时,view会使用缺省的delegate来提供一个编辑构件。

一个model,多个views

为多个views提供相同的model是非常简单的事情,只要为每个view设置相同的model。
     QTableView *firstTableView = new QTableView;
     QTableView *secondTableView = new QTableView;

firstTableView->setModel(model);
     secondTableView->setModel(model);
在model/view架构中信号、槽机制的使用意味着model中发生的改变会传递中联结的所有view中,这保证了
不管我们使用哪个view,访问的都是同样的一份数据。

上面的图展示了一个model上的两个不同的views,尽管在不同的view中显示的model中的数据是一致的,每个
view都维护它们自己的内部选择模型,但有时候在某些情况下,共享一个选择模型也是合理的。

处理数据项的选择

view中数据项选择机制由QItemSelectionModel类提供。所有标准的view缺省都构建它们自己的选择模型,
以标准的方式与它们交互。选择模型可以用selectionModel()函数取得,替代的选择模型也可以通过
setSelectionModel()来设置。当我们想在一个model上提供多个一致的views时,这种对选择模型的控制能力非常有用。通常来讲,除非你子类化一个model或view,你不必直接操纵selections的内容。

多个views之间共享选择

接着上边的例子,我们可以这样:
secondTableView->setSelectionModel(firstTableView->selectionModel());
现在所有views都在同样的选择模型上操作,数据与选择项都保持同步。

上面的例子中,两个view的类型是相同的,假如这两个view类型不同,那么所选择的数据项在每个view
中的表现形式会有很大的不同。例如,在一个table view中一个连续的选择,在一个tree view中表现出
来的可能会是几个高亮的数据项片断的组合。

QModelIndex/Role/Model介紹一相关推荐

  1. OpenPose 使用介紹

    OpenPose 使用介紹 1. 簡介 2. 基礎使用 (Windows) 3. 常見Flag 4. Pose Output Format 5. 常見報錯 1. 簡介 可以實現單人/多人的人體動作.臉 ...

  2. telnet/ftp/netstat/ping命令詳細介紹

     很多朋友问到telnet/ftp/netstat/ping 命令的使用方法 今天我就抽点时间做个telnet/ftp/netstat/ping 命令一詳細介紹! 请入门者静下心来.......... ...

  3. mysql中merge的用法_mysql中merge表存儲引擎用法介紹

    mysql中merge表存儲引擎用法介紹: mysql的merge引擎類型允許你把許多結構相同的表合並為一個表.然后,你可以執行查詢,從多個表返回的結果就像從一個表返回的結果一樣.每一個合並的表必須有 ...

  4. matlab engevalstring,Matlab 執行engEvalString命令介紹 | 學步園

    MATLAB與VC混合編程指導書 在調用 Matlab 引擎之前,首先應在相關文件中加入一行: #include "enging.h" ,該文件包含了引擎 API 函數的說明和所需 ...

  5. wpbakery Visual Composer - web网页可视化 编辑器 介紹

    wpbakery  Visual Composer web网页可视化 编辑器 介紹 近日在做關鍵字研究時,無意間發現到這篇文章,放棄 WordPress 選用 Joomla! CMS 的5個理由.內容 ...

  6. 我推崇的流行唱法:美國Speech Level Singing的介紹和討論(推荐)

    Speech Level Singing 是近年來在美國很流行的一種聲樂教法.創始人Seth Riggs 原本是唱歌劇的,因為不滿意美國現在的聲樂教育而自創了一套練習方法,結果桃李滿天下(在美國,歐洲 ...

  7. 第一集 DLNA 白話文介紹

    今天和大家分享 DLNA 這個東東.DLNA 的全名是  Digital Living Network Alliance ,聽名字一點都不酷,這也是開放式標準的悲哀,常常缺乏一個響亮好記的商業口號來推 ...

  8. JS---Cookies完整介紹 申精!

    Cookies現在經常被大家提到,那麼到底什麼是Cookies,它有什麼作用呢?Cookies是一種能夠讓網站伺服器把少量數據儲存到用戶端的硬碟或記憶體,或是從用戶端的硬碟讀取數據的一種技術. Coo ...

  9. ATA-over-Ethernet(AoE)介紹

    ATA-over-Ethernet(AoE)介紹:一種 iSCSI 與 Fibre Channel 之替代方案,TeraByte 等級磁碟儲存系統 本文主要介紹 ATA-over-Ethernet(A ...

  10. 三菱PLC定位模組介紹 PART1 功能簡介

    QD75為普通脈衝定位模組,最大是4軸,因為是普通脈衝定位,所以可以接三菱的普通伺服,也可以接其他品牌的伺服. QD75P為開集電極輸出型定位模組 QD75D為差動驅動輸出型定位模組 QD77MS是通 ...

最新文章

  1. java循环使用范围_Java循环流程控制语句
  2. java判断表是否存在_java怎么判断表是否存在?
  3. Method Tracking
  4. docker 网络模型
  5. 【转载】oracle闪回技术详解之闪回drop(神奇的flashback)
  6. java采集温湿度水浸_机房水浸传感器:智能生活不可或缺的漏水传感器
  7. php post修改字段,单个{customposttype}.php中的函数wp_insert_post()清除自定义字段
  8. xlib/x11:创建一个监测键盘事件的窗口-3-fullscreen-windowed
  9. python导入数据画折线图_Python读取Excel表格,并同时画折线图和柱状图的方法
  10. vue 生成二维码:vue-qr插件
  11. ML/DL-复习笔记【二】- L1正则化和L2正则化
  12. python----------基于TCP的交互式游戏设计
  13. 使用Lens管理多云Kubernetes
  14. OpenGL表面剔除
  15. 你们还不了解YUM的使用?那就看看这篇文章把~
  16. 划分计算机发展的四个阶段主要依据,计算机的发展划分为4个阶段,分别为什么、什么、什么和什么。...
  17. Resource体系
  18. Monkey的测试原理和方法
  19. 保存地理坐标信息的SLIC分割结果
  20. win11使用win10右键菜单的方法

热门文章

  1. 不礼让行人怎么抓拍的_注意啦!电子警察如何抓拍不礼让行人?所有司机都要看看...
  2. SpringCloud Alibaba微服务实战一 基础环境准备
  3. 与“雾霾”相关的英语表达
  4. R语言计算回归模型R方(R-Squared)实战
  5. linux下查看巨杉数据库,SequoiaDB巨杉数据库入门:快速搭建流媒体服务器
  6. 利用快代理搭建自己的代理池(妈妈再也不用担心IP被封了)
  7. Android 10.0设置默认sim1卡使用数据流量和发送短信
  8. 个人修改机智云apk之出现couldn‘t find “libSDKLog.so“错误导致机智云apk在真机上调试出现keeps stopping错误解决方法
  9. PageOffice常用功能之-OA系统中的文档在线编辑及流转
  10. C语言 AES加解密