欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    QtModelView学习总结笔记_外语学习-法语学习.pdf

    • 资源ID:93972505       资源大小:1.45MB        全文页数:25页
    • 资源格式: PDF        下载积分:5.3金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要5.3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    QtModelView学习总结笔记_外语学习-法语学习.pdf

    学习必备 欢迎下载 Qt Model/View 学习笔记 Qt Model/View 学习笔记(一)Qt 4推出了一组新的 item view 类,它们使用 model/view 结构来管理数据与表示层的关系。这种结构带来的功能上的分离给了开发人员更大的弹性来定制数据项的表示,它也提供一个标准的 model 接口,使得更多的数据源可以被这些 item view 使用。这里对 model/view 的结构进行了描述,结构中的每个组件都进行了解释,给出了一些例子说明了提供的这些类如何使用。Model/View 结构 Model-View-Controller(MVC),是从 Smalltalk 发展而来的一种设计模式,常被用于构建用户界面。经典设计模式的著作中有这样的描述:MVC 由三种对象组成。Model 是应用程序对象,View 是它的屏幕表示,Controller 定义了用户界面如何对用户输入进行响应。在 MVC 之前,用户界面设计倾向于三者揉合在一起,MVC 对它们进行了解耦,提高了灵活性与重用性。假如把 view 与 controller 结合在一起,结果就是 model/view 结构。这个结构依然是把数据存储与数据表示进行了分离,它与 MVC 都基于同样的思想,但它更简单一些。这种分离使得在几个不同的 view 上显示同一个数据成为可能,也可以重新实现新的 view,而不必改变底层的数据结构。为了更灵活的对用户输入进行处理,引入了 delegate 这个概念。它的好处是,数据项的渲染与编程可以进行定制。如上图所示,model 与数据源通讯,并提供接口给结构中的别的组件使用。通讯的性质依赖于数据源的种类与 model 实现的方式。view 从 model 获取 model indexes,后者是数据项的引用。通过把 model indexes 提供给 model,view 可以从数据源中获取数据。在标准的 views 中,delegate 会对数据项进行渲染,当某个数据项被选中时,delegate学习必备 欢迎下载 通过 model indexes 与 model 直接进行交流。总的来说,model/view 相关类可以被分成上面所提到的三组:models,views,delegates。这些组件通过抽象类来定义,它们提供了共同的接口,在某些情况下,还提供了缺省的实现。抽象类意味着需要子类化以提供完整的其他组件希望的功能。这也允许实现定制的组件。models,views,delegates 之间通过信号,槽机制来进行通讯:从 model 发出的信号通知 view 数据源中的数据发生了改变。从 view 发出的信号提供了有关被显示的数据项与用户交互的信息。从 delegate 发生的信号被用于在编辑时通知 model 和 view 关于当前编辑器的状态信息。Models 所有的 item models 都基于 QAbstractItemModel 类,这个类定义了用于 views 和 delegates访问数据的接口。数据本身不必存储在 model,数据可被置于一个数据结构或另外的类,文件,数据库,或别的程序组件中。关于 model 的基本概念在 Model Classes 部分中描述。QAbstractItemModel 提供给数据一个接口,它非常灵活,基本满足 views 的需要,无论数据用以下任何样的形式表现,如 tables,lists,trees。然而,当你重新实现一个 model 时,如果它基于 table 或 list 形式的数据结构,最好从 QAbstractListModel,QAbstractTableModel开始做起,因为它们提供了适当的常规功能的缺省实现。这些类可以被子类化以支持特殊的定制需求。子类化 model 的过程在 Create New Model 部分讨论 QT 提供了一些现成的 models 用于处理数据项:QStringListModel 用于存储简单的 QString 列表。QStandardItemModel 管理复杂的树型结构数据项,每项都可以包含任意数据。QDirModel 提供本地文件系统中的文件与目录信息。QSqlQueryModel,QSqlTableModel,QSqlRelationTableModel用来访问数据库。假如这些标准 Model 不满足你的需要,你应该子类化QAbstractItemModel,QAbstractListModel或是 QAbstractTableModel 来定制。Views 不同的 view 都完整实现了各自的功能:QListView 把数据显示为一个列表,QTableView把 Model 中的数据以 table 的形式表现,QTreeView 用具有层次结构的列表来显示 model中的数据。这些类都基于 QAbstractItemView 抽象基类,尽管这些类都是现成的,完整的进行了实现,但它们都可以用于子类化以便满足定制需求。Delegates 的功能上的分离给了开发人员更大的弹性来定制数据项的表示它也提供一个标准的接口使得更多的数据源可以被这些使用这里对的结构进行了描述结构中的每个组件都进行了解释给出了一些例子说明了提供的这些类如何使用结构是序对象是它的屏幕表示定义了用户界面如何对用户输入进行响应在之前用户界面设计向于三者揉合在一起对它们进行了解耦提高了灵活性与重用性假如把与结合在一起结果就是结构这个结构依然是把数据存储与数据表示进行了分离的而不必改变底层的数据结构为了更灵活的对用户输入进行处理引入了这个概念它的好处是数据项的渲染与编程可以进行定制如上图所示与数据源通讯并提供接口给结构中的别的组件使用通讯的性质依赖于数据源的种类与实现的方学习必备 欢迎下载 QAbstractItemDelegate 是model/view 架构中的用于delegate 的抽象基类。缺省的delegate实现在 QItemDelegate 类中提供。它可以用于 Qt 标准 views 的缺省 delegate.排序 在 model/view 架构中,有两种方法进行排序,选择哪种方法依赖于你的底层 Model。假如你的 model 是可排序的,也就是它重新实现了 QAbstractItemModel:sort()函数,QTableView 与 QTreeView 都提供了 API,允许你以编程的方式对 Model 数据进行排序。另外,你也可以进行交互方式下的排序(例如,允许用户通过点击 view 表头的方式对数据进行排序),可以这样做:把 QHeaderView:sectionClicked()信号与 QTableView:sortByColum()槽或QTreeView:sortByColumn()槽进行联结就好了。另一种方法是,假如你的 model 没有提供需要的接口或是你想用 list view 表示数据,可以用一个代理 model 在用 view 表示数据之前对你的 model 数据结构进行转换。便利类 许多便利类都源于标准的 view 类,它们方便了那些使用 Qt 中基于项的 view 与 table 类,它们不应该被子类化,它们只是为 Qt 3的等价类提供一个熟悉的接口。这些类有QListWidget,QTreeWidget,QTableWidget,它们提供了如 Qt 3中的 QListBox,QlistView,QTable相似的行为。这些类比 View 类缺少灵活性,不能用于任意的 models,推介使用 model/view的方法处理数据。Qt Model/View 学习笔记(二)介绍 Qt 提供了两个标准的 models:QStandardItemModel和 QDirModel。QStandardItemModel是一个多用途的 model,可用于表示 list,table,tree views 所需要的各种不同的数据结构。这个model 也持有数据。QDirModel 维护相关的目录内容的信息,它本身不持有数据,仅是对本地文件系统中的文件与目录的描述。QDirModel 是一个现成的 model,很容易进行配置以用于现存的数据,使用这个 model,可以很好地展示如何给一个现成的 view 设定 model,研究如何用 model indexes 来操纵数据。model 与 views 的搭配使用 QListView 与 QTreeView 很适合与 QDirModel 搭配。下面的例子在 tree view 与 list view显示了相同的信息,QDirModel 提供了目录内容数据。这两个 Views 共享用户选择,因此每个被选择的项在每个 view 中都会被高亮。的功能上的分离给了开发人员更大的弹性来定制数据项的表示它也提供一个标准的接口使得更多的数据源可以被这些使用这里对的结构进行了描述结构中的每个组件都进行了解释给出了一些例子说明了提供的这些类如何使用结构是序对象是它的屏幕表示定义了用户界面如何对用户输入进行响应在之前用户界面设计向于三者揉合在一起对它们进行了解耦提高了灵活性与重用性假如把与结合在一起结果就是结构这个结构依然是把数据存储与数据表示进行了分离的而不必改变底层的数据结构为了更灵活的对用户输入进行处理引入了这个概念它的好处是数据项的渲染与编程可以进行定制如上图所示与数据源通讯并提供接口给结构中的别的组件使用通讯的性质依赖于数据源的种类与实现的方学习必备 欢迎下载 先装配出一个 QDirModel 以供使用,再创建 views 去显示目录的内容。这给我展示了使用 model 的最简单的方式。model 的创建与使用都在 main()函数中完成:int main(int argc,char*argv)QApplication app(argc,argv);QSplitter*splitter=new QSplitter;QDirModel*model=new QDirModel;/从缺省目录创建数据 QTreeView*tree=new QTreeView(splitter);tree-setModel(model);tree-setRootIndex(model-index(QDir:currentPath();QListView*list=new QListView(splitter);list-setModel(model);list-setRootIndex(model-index(QDir:currentPath();/配置一个 view 去显示 model 中的数据,只需要简单地调用 setModel(),并把目录 model作为参数传递 /setRootIndex()告诉 views 显示哪个目录的信息,这需要提供一个 model index,然后用这个 /model index 去 model 中去获取数据 /index()这个函数是QDirModel 特有的,通过把一个目录做为参数,得到了需要的model index /其他的代码只是窗口 show 出来,进入程序的事件循环就好了 splitter-setWindowTitle(Two views onto the same directory model);splitter-show();return app.exec();的功能上的分离给了开发人员更大的弹性来定制数据项的表示它也提供一个标准的接口使得更多的数据源可以被这些使用这里对的结构进行了描述结构中的每个组件都进行了解释给出了一些例子说明了提供的这些类如何使用结构是序对象是它的屏幕表示定义了用户界面如何对用户输入进行响应在之前用户界面设计向于三者揉合在一起对它们进行了解耦提高了灵活性与重用性假如把与结合在一起结果就是结构这个结构依然是把数据存储与数据表示进行了分离的而不必改变底层的数据结构为了更灵活的对用户输入进行处理引入了这个概念它的好处是数据项的渲染与编程可以进行定制如上图所示与数据源通讯并提供接口给结构中的别的组件使用通讯的性质依赖于数据源的种类与实现的方学习必备 欢迎下载 Qt Model/View 学习笔记(三)Model 类 基本概念 在 model/view 构架中,model 为 view 和 delegates 使用数据提供了标准接口。在 Qt 中,标准接口 QAbstractItemModel 类中被定义。不管数据在底层以何种数据结构存储,QAabstractItemModel 的子类会以层次结构的形式来表示数据,结构中包含了数据项表。我们按这种约定来访问 model 中的数据项,但这个约定不会对如何显示这些数据有任何限制。数据发生改变时,model 通过信号槽机制来通知关联的 views。Model Indexes 为了使数据存储与数据访问分开,引入了 model index 的概念。通过 model index,可以引用 model 中的数据项,Views 和 delegates 都使用 indexes 来访问数据项,然后再显示出来。因此,只有 model 需要了解如何获取数据,被 model 管理的数据类型可以非常广泛地被定义。Model indexes 包含一个指向创建它们的 model 的指针,这会在配合多个 model 工作时避免混乱。QAbstractItemModel*model=index.model();model indexes 提供了对一项数据信息的临时引用,通过它可以访问或是修改 model 中的数据。既然 model 有时会重新组织内部的数据结构,这时 model indexes 便会失效,因此不应该保存临时的 model indexes。假如需要一个对数据信息的长期的引用,那么应该创建一个 persistent model index。这个引用会保持更新。临时的 model indexes 由 QModelIndex 提供,而具有持久能力的 model indexes 则由 QPersistentModelIndex 提供。在获取对应一个数据项的 model index 时,需要考虑有关于 model 的三个属性:行数,列数,父项的 model index。行与列 的功能上的分离给了开发人员更大的弹性来定制数据项的表示它也提供一个标准的接口使得更多的数据源可以被这些使用这里对的结构进行了描述结构中的每个组件都进行了解释给出了一些例子说明了提供的这些类如何使用结构是序对象是它的屏幕表示定义了用户界面如何对用户输入进行响应在之前用户界面设计向于三者揉合在一起对它们进行了解耦提高了灵活性与重用性假如把与结合在一起结果就是结构这个结构依然是把数据存储与数据表示进行了分离的而不必改变底层的数据结构为了更灵活的对用户输入进行处理引入了这个概念它的好处是数据项的渲染与编程可以进行定制如上图所示与数据源通讯并提供接口给结构中的别的组件使用通讯的性质依赖于数据源的种类与实现的方学习必备 欢迎下载 在最基本的形式中,一个 model 可作为一个简单的表来访问,每个数据项由行,列数来定位。这必不意味着底层的数据用数组结构来存储。行和列的使用仅仅是一种约定,它允许组件之间相互通讯。可以通过指定 model 中的行列数来获取任一项数据,可以得到与数据项一一对应的那个 index。QModelIndex index=model-index(row,column,.);Model 为简单的,单级的数据结构如 list 与 tables 提供了接口,它们如上面代码所显示的那样,不再需要别的信息被提供。当我们在获取一个 model index 时,我们需要提供另外的信息。上图代表一个基本的 table model,它的每一项用一对行列数来定位。通过行列数,可以获取代表一个数据项的 model index.QModelIndex indexA=model-index(0,0,QModelIndex();QModelIndex indexB=model-index(1,1,QModelIndex();QModelIndex indexC=model-index(2,1,QModelIndex();一个 model 的顶级项,由 QModelIndex()取得,它们上式被用作父项。父项 类似于表的接口在搭配使用 table 或 list view 时理想的,这种行列系统与 view 显示的方式是确切匹配的。然则,像 tree views 这种结构需要 model 提供更为灵活的接口来访问数据项。每个数据项可能是别的项的父项,上级的项可以获取下级项的列表。当获取 model 中数据项的 index 时,我们必须指定关于数据项的父项的信息。在 model外部,引用一个数据项的唯一方法就是通过 model index,因此需要在求取 model index 时指定父项的信息。的功能上的分离给了开发人员更大的弹性来定制数据项的表示它也提供一个标准的接口使得更多的数据源可以被这些使用这里对的结构进行了描述结构中的每个组件都进行了解释给出了一些例子说明了提供的这些类如何使用结构是序对象是它的屏幕表示定义了用户界面如何对用户输入进行响应在之前用户界面设计向于三者揉合在一起对它们进行了解耦提高了灵活性与重用性假如把与结合在一起结果就是结构这个结构依然是把数据存储与数据表示进行了分离的而不必改变底层的数据结构为了更灵活的对用户输入进行处理引入了这个概念它的好处是数据项的渲染与编程可以进行定制如上图所示与数据源通讯并提供接口给结构中的别的组件使用通讯的性质依赖于数据源的种类与实现的方学习必备 欢迎下载 QModelIndex index=model-index(row,column,parent);上图中,A 项和 C 项作为 model 中顶层的兄弟项:QModelIndex indexA=model-index(0,0,QModelIndex();QModelIndex indexC=model-index(2,1,QModelIndex();A 有许多孩子,它的一个孩子 B 用以下代码获取:QModelIndex indexB=model-index(1,0,indexA);项角色 model 中的项可以作为各种角色来使用,这允许为不同的环境提供不同的数据。举例来说,Qt:DisplayRole 被用于访问一个字符串,它作为文本会在 view 中显示。典型地,每个数据项都可以为许多不同的角色提供数据,标准的角色在 Qt:ItemDataRole 中定义。我们可以通过指定 model index 与角色来获取我们需要的数据:QVariant value=model-data(index,role);的功能上的分离给了开发人员更大的弹性来定制数据项的表示它也提供一个标准的接口使得更多的数据源可以被这些使用这里对的结构进行了描述结构中的每个组件都进行了解释给出了一些例子说明了提供的这些类如何使用结构是序对象是它的屏幕表示定义了用户界面如何对用户输入进行响应在之前用户界面设计向于三者揉合在一起对它们进行了解耦提高了灵活性与重用性假如把与结合在一起结果就是结构这个结构依然是把数据存储与数据表示进行了分离的而不必改变底层的数据结构为了更灵活的对用户输入进行处理引入了这个概念它的好处是数据项的渲染与编程可以进行定制如上图所示与数据源通讯并提供接口给结构中的别的组件使用通讯的性质依赖于数据源的种类与实现的方学习必备 欢迎下载 角色指出了从 model 中引用哪种类型的数据。views 可以用不同的形式显示角色,因此为每个角色提供正确的信息是非常重要的。通过为每个角色提供适当数据,model 也为 views和 delegates 提供了暗示,如何正确地把这些数据项显给用户。不同的 views 可以自由地解析或忽略这些数据信息,对于特殊的场合,也可以定义一些附加的角色。概念总结:1,Model indexes 为 views 与 delegages 提供 model 中数据项定位的信息,它与底层的数据结构无关。2,通过指定行,列数,父项的 model index 来引用数据项。3,依照别的组件的要求,model indexes 被 model 构建。4,使用 index()时,如果指定了有效的父项的 model index,那么返回得到的 model index对应于父项的某个孩子。5,使用 index()时,如果指定了无效的父项的 model index,那么返回得到的 model index对应于顶层项的某个孩子。6,角色对一个数据项包含的不同类型的数据给出了区分。使用 Model Indexes QDirModel*model=new QDirModel;QModelIndex parentIndex=model-index(QDir:currentPath();int numRows=model-rowCount(parentIndex);for(int row=0;row index(row,0,parentIndex);tring text=model-data(index,Qt:DisplayRole).toString();的功能上的分离给了开发人员更大的弹性来定制数据项的表示它也提供一个标准的接口使得更多的数据源可以被这些使用这里对的结构进行了描述结构中的每个组件都进行了解释给出了一些例子说明了提供的这些类如何使用结构是序对象是它的屏幕表示定义了用户界面如何对用户输入进行响应在之前用户界面设计向于三者揉合在一起对它们进行了解耦提高了灵活性与重用性假如把与结合在一起结果就是结构这个结构依然是把数据存储与数据表示进行了分离的而不必改变底层的数据结构为了更灵活的对用户输入进行处理引入了这个概念它的好处是数据项的渲染与编程可以进行定制如上图所示与数据源通讯并提供接口给结构中的别的组件使用通讯的性质依赖于数据源的种类与实现的方学习必备 欢迎下载 /Display the text in a widget.以上的例子说明了从 model 中获取数据的基本原则:1,model 的尺寸可以从 rowCount()与 columnCount()中得出。这些函数通常都需要一个表示父项的 model index。2,model indexes 用来从 model 中访问数据项,数据项用行,列,父项 model index 定位。3,为了访问 model 顶层项,可以使用 QModelIndex()指定。4,数据项为不同的角色提供不同的数据。为了获取数据,除了 model index 之外,还要指定角色。Qt Model/View 学习笔记(四)创建新的 Models 介绍 model/view 组件之间功能的分离,允许创建 model 利用现成的 views。这也可以使用标准的功能 图形用户接口组件像QListView,QTableView和 QTreeView 来显示来自各种数据源的数据为。QAbstractListModel 类提供了非常灵活的接口,允许数据源以层次结构的形式来管理信息,也允许以某种方式对数据进行插入、删除、修改和存储。它也提供了对拖拽操作的支持。QAbstractListModel 与 QAbstractTableModel 为简单的非层次结构的数据提供了接口,对于比较简单的 list 和 table models 来说,这是不错的一个开始点。设计一个 Model 当我们为存在的数据结构新建一个 model 时,首先要考虑的问题是应该选用哪种 model来为这些数据提供接口。假如数据结构可以用数据项的列表或表来表示,那么可以考虑子类化QAbstractListModel 或 QAbstractTableModel,既然这些类已经合理地对许多功能提供缺省实现。然而,假如底层的数据结构只能表示成具有层次结构的树型结构,那么必须得子类化QAbstractItemModel。无论底层的数据结构采取何种形式,在特定的 model 中实现标准的 QAbstractItemModel API 总是一个不错的主意,这使得可以使用更自然的方式对底层的数据结构进行访问。这也使得用数据构建 model 更为容易,其他的 model/view 组件也可以使用标准的 API 与之进行交互。一个只读 model 示例 的功能上的分离给了开发人员更大的弹性来定制数据项的表示它也提供一个标准的接口使得更多的数据源可以被这些使用这里对的结构进行了描述结构中的每个组件都进行了解释给出了一些例子说明了提供的这些类如何使用结构是序对象是它的屏幕表示定义了用户界面如何对用户输入进行响应在之前用户界面设计向于三者揉合在一起对它们进行了解耦提高了灵活性与重用性假如把与结合在一起结果就是结构这个结构依然是把数据存储与数据表示进行了分离的而不必改变底层的数据结构为了更灵活的对用户输入进行处理引入了这个概念它的好处是数据项的渲染与编程可以进行定制如上图所示与数据源通讯并提供接口给结构中的别的组件使用通讯的性质依赖于数据源的种类与实现的方学习必备 欢迎下载 这个示例实现了一个简单的,非层次结构的,只读的数据 model,它基于 QStringistModel类。它有一个 QStringList 作为它内部的数据源,只实现了一些必要的接口。为了简单化,它子类化了 QAbstractListModel,这个基类提供了合理的缺省行为,对外提供了比AbstractItemModel 更为简单的接口。当我们实现一个 model 时,不要忘了 AbstractItemModel本身不存储任何数据,它仅仅提供了给 views 访问数据的接口。class StringListModel:public QAbstractListModel Q_OBJECT public:StringListModel(const QStringList&strings,QObject*parent=0):QAbstractListModel(parent),stringList(strings)int rowCount(const QModelIndex&parent=QModelIndex()const;QVariant data(const QModelIndex&index,int role)const;QVariant headerData(int section,Qt:Orientation orientation,int role=Qt:DisplayRole)const;private:QStringList stringList;除了构造函数,我们仅需要实现两个函数:rowCount()返回 model 中的行数,data()返回与特定 model index 对应的数据项。具有良好行为的 model 也会实现 headerData(),它返回 tree和 table views 需要的,在标题中显示的数据。因为这是一个非层次结构的 model,我们不必考虑父子关系。假如 model 具有层次结构,我们也应该实现 index()与 parent()函数。Model 的尺寸 我们认为 model 中的行数与 string list 中的 string 数目一致:int StringListModel:rowCount(const QModelIndex&parent)const return stringList.count();在缺省情况下,从 QAbstractListModel 派生的 model 只具有一列,因此不需要实现columnCount()。的功能上的分离给了开发人员更大的弹性来定制数据项的表示它也提供一个标准的接口使得更多的数据源可以被这些使用这里对的结构进行了描述结构中的每个组件都进行了解释给出了一些例子说明了提供的这些类如何使用结构是序对象是它的屏幕表示定义了用户界面如何对用户输入进行响应在之前用户界面设计向于三者揉合在一起对它们进行了解耦提高了灵活性与重用性假如把与结合在一起结果就是结构这个结构依然是把数据存储与数据表示进行了分离的而不必改变底层的数据结构为了更灵活的对用户输入进行处理引入了这个概念它的好处是数据项的渲染与编程可以进行定制如上图所示与数据源通讯并提供接口给结构中的别的组件使用通讯的性质依赖于数据源的种类与实现的方学习必备 欢迎下载 Model 标题与数据 QVariant StringListModel:data(const QModelIndex&index,int role)const if(!index.isV alid()return QVariant();if(index.row()=stringList.size()return QVariant();if(role=Qt:DisplayRole)return stringList.at(index.row();else return QVariant();QVariant StringListModel:headerData(int section,Qt:Orientation orientation,int role)const if(role!=Qt:DisplayRole)return QVariant();if(orientation=Qt:Horizontal)return QString(Column%1).arg(section);else return QString(Row%1).arg(section);一个数据项可能有多个角色,根据角色的不同输出不同的数据。上例中,model 中的数据项只有一个角色,DisplayRole,然而我们也可以重用提供给 DisplayRole 的数据,作为别的角色使用,如我们可以作为 ToolTipRole 来用。可编辑的 model 上面我们演示了一个只读的 model,它只用于向用户显示,对于许多程序来说,可编辑的list model 可能更有用。我们只需要给只读的 model 提供另外两个函数 flags()与 setData()的实现。下列函数声明被添加到类定义中:Qt:ItemFlags flags(const QModelIndex&index)const;的功能上的分离给了开发人员更大的弹性来定制数据项的表示它也提供一个标准的接口使得更多的数据源可以被这些使用这里对的结构进行了描述结构中的每个组件都进行了解释给出了一些例子说明了提供的这些类如何使用结构是序对象是它的屏幕表示定义了用户界面如何对用户输入进行响应在之前用户界面设计向于三者揉合在一起对它们进行了解耦提高了灵活性与重用性假如把与结合在一起结果就是结构这个结构依然是把数据存储与数据表示进行了分离的而不必改变底层的数据结构为了更灵活的对用户输入进行处理引入了这个概念它的好处是数据项的渲染与编程可以进行定制如上图所示与数据源通讯并提供接口给结构中的别的组件使用通讯的性质依赖于数据源的种类与实现的方学习必备 欢迎下载 bool setData(const QModelIndex&index,const QVariant&value,int role=Qt:EditRole);让 model 可编辑 delegate 会在创建编辑器之前检查数据项是否是可编辑的。model 必须得让 delegate 知道它的数据项是可 编辑的。这可以通过为每一个数据项返回一个正确的标记得到,在本例中,我们假设所有的数据项都是 可编辑可选择的:Qt:ItemFlags StringListModel:flags(const QModelIndex&index)const if(!index.isV alid()return Qt:ItemIsEnabled;return QAbstractItemModel:flags(index)|Qt:ItemIsEditable;我们不必知道 delegate 执行怎样实际的编辑处理过程,我们只需提供给 delegate 一个方法,delegate 会使用它对 model 中的数据进行设置。这个特殊的函数就是 setData():bool StringListModel:setData(const QModelIndex&index,const QVariant&value,int role)if(index.isValid()&role=Qt:EditRole)stringList.replace(index.row(),value.toString();emit dataChanged(index,index);return true;return false;当数据被设置后,model 必须得让 views 知道一些数据发生了变化,这可通过发射一个dataChanged()信号实现。因为只有一个数据项发生了变化,因此在信号中说明的变化范围只限于一个 model index。的功能上的分离给了开发人员更大的弹性来定制数据项的表示它也提供一个标准的接口使得更多的数据源可以被这些使用这里对的结构进行了描述结构中的每个组件都进行了解释给出了一些例子说明了提供的这些类如何使用结构是序对象是它的屏幕表示定义了用户界面如何对用户输入进行响应在之前用户界面设计向于三者揉合在一起对它们进行了解耦提高了灵活性与重用性假如把与结合在一起结果就是结构这个结构依然是把数据存储与数据表示进行了分离的而不必改变底层的数据结构为了更灵活的对用户输入进行处理引入了这个概念它的好处是数据项的渲染与编程可以进行定制如上图所示与数据源通讯并提供接口给结构中的别的组件使用通讯的性质依赖于数据源的种类与实现的方学习必备 欢迎下载 插入,删除行 在 model 中改变行数与列数是可能的。当然在本列中,只考虑行的情况,我们只需要重新实现插入、删除的函数就可以了,下面应在类定义中声明:bool insertRows(int position,int rows,const QModelIndex&index=QModelIndex();bool removeRows(int position,int rows,const QModelIndex&index=QModelIndex();既然 model 中的每行对应于列表中的一个 string,因此,insertRows()函数在 string list 中指定位置插入一个空 string,父 index 通常用于决定 model 中行列的位置,本例中只有一个单独的顶级项,因此只需要在 list 中插入空 string。bool StringListModel:insertRows(int position,int rows,const QModelIndex&parent)beginInsertRows(QModelIndex(),position,position+rows-1);for(int row=0;row rows;+row)stringList.insert(position,);endInsertRows();return true;beginInsertRows()通知其他组件行数将会改变。endInsertRows()对操作进行确认与通知。返回 true 表示成功。删除操作与插入操作类似:bool StringListModel:removeRows(int position,int rows,const QModelIndex&parent)beginRemoveRows(QModelIndex(),position,position+rows-1);for(int row=0;row rows;+row)stringList.removeAt(position);endRemoveRows();return true;的功能上的分离给了开发人员更大的弹性来定制数据项的表示它

    注意事项

    本文(QtModelView学习总结笔记_外语学习-法语学习.pdf)为本站会员(c****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开