Qt MVC学习 模型子类化参考

模型的子类需要提供很多在QAbstractItemModel中定义的虚函数的实现。需要实现的方法的数量取决于你想创建的子类的风格——它提供一个简单的列表视图,还是一个表格视图,或者是一个复杂的层次视图。从QAbstractListModel和QAbstractTableModel继承的子类可以直接利用这两个类的许多默认的虚函数。

子类中需要实现的方法可以分为三种:

1. 处理项数据:所有的模型需要实现方法来保证视图和委托能够查询模型的尺寸、检测每个项以及返回其中的数据。

2. 浏览和创建索引:具有层次关系的模型需要实现方法来使得视图可以调用它们来它们公开的树形结构,并获得每个项的模型索引。

3. 支持拖拽操作和处理MIME类型数据:模型继承方法来控制内部和外部的拖拽行为的实现方式。这些方法允许项数据被描述为其他的组件和应用能够接受的MIME类型。

项数据管理

对于模型中的数据,模型可以提供多种等级的访问:只读, 调整大小和编辑。

只读访问

一个模型如果想实现对数据的只读访问,这些方法必须被子类实现:

Flags():这个方法被其他的组件使用来获得该模型的每个项数据的信息。标志位的组合应当包括Qt::ItemIsEnabled和Qt::ItemIsSelectable。

Data():用来把项数据提供给视图和委托。一般地,模型只需要为Qt::DisplayRole和其他的特定应用的用户角色。但是把数据提供给Qt::ToolTipRole和Qt::AccessibleTextRole和Qt::AccessibleDescriptionRole同样是很好的选择。请参阅Qt::ItemDataRole枚举值手册来获取与每个角色有关的类型的信息。

headerData():提供能显示标头信息的视图。能够显示标头信息的视图才能得到这些信息。

rowCount():提供模型公开的数据的行数。

这4个方法在任何类型的模型中(包括列表模型,即QAbstractListModel及其子类,和表格模型,即QAbstractTableModel及其子类)都必须被实现。

另外,以下的方法必须在QAbstractTableModel和QAbstractItemModel的直接子类中实现:

columnCount():提供模型公开的数据的列数,列表模型不需要提供它的实现因为它已经在QAbstractListModel中实现了。

可编辑项

可编辑模型允许项数据被更改,也可以提供方法来插入或者删除行和列。要使能编辑功能,以下这些方法必须被正确实现:

Flags():必须为每个项返回正确的标识位组合。特别地,除了提供给只读模型中的数据项的值以外,还必须包括Qt::ItemIsEditable。

setData():用来改变一个与特定的模型索引相联系的项的值。为了能够接受用户接口元素提供的用户输入,这个方法必须处理与Qt::EditRole相关联的数据。这个实现也可以接受与其他的Qt::EditRole值相关联的数据。在修改数据完成后,模型必须发射dataChanged()信号来通知其他的组件这里发生了改变。

setHeaderData():用来改变行或列的标头信息。在修改完成后,模型必须发射headerDataChanged()信号来通知其他的组件这里发生了改变。

时间: 2024-11-10 14:07:32

Qt MVC学习 模型子类化参考的相关文章

Qt MVC设计模式:子类化抽象模型的方法

模型子类化参考 模型的子类需要提供很多在QAbstractItemModel中定义的虚函数的实现.需要实现的方法的数量取决于你想创建的子类的风格--它提供一个简单的列表视图,还是一个表格视图,或者是一个复杂的层次视图.从QAbstractListModel和QAbstractTableModel继承的子类可以直接利用这两个类的许多默认的虚函数. 子类中需要实现的方法可以分为三种: 1. 处理项数据:所有的模型需要实现方法来保证视图和委托能够查询模型的尺寸.检测每个项以及返回其中的数据. 2. 浏

ASP.NET MVC学习之模型绑定(2)

3.手工调用模型绑定 很多情况下我们都是通过形参的方式接收来自http流中的数据,这看似是完美的,但是缺少了很多过程中的控制,所以我们就需要使用手工的方式进行绑定.下面我们通过一个例子来说明,首先打开Views/Home/Index.cshtml页面,并输入如下代码: 1 @{ 2 ViewBag.Title = "Index"; 3 } 4 5 @if (TempData.ContainsKey("msg")) 6 { 7 <h1> 8 @TempDa

ASP.NET MVC学习之模型验证篇

一.学习前的一句话 在这里要先感谢那些能够点开我随笔的博友们.慢慢的已经在博客园中度过一年半了,伊始只是将博客园作为自己学习的记录本一样使用,也不敢将自己的随笔发表到博客园首页,生怕自己的技艺不高,反倒成了笑话.但是随着时间的推移,再也按捺不住这种想法,于是就写了一篇随笔发表到博客园首页.让我意想不到的是有许多人都看了,而且也留下了评论.这让我鼓起勇气写了第二.三.四篇.到现在的连载,这里我希望那些从未发表过随笔的人可以尝试去发表,在这里他人不会嘲讽你,而是会给你更好的建议.说了这么多下面我们继

ASP.NET MVC学习之模型绑定(1)

一.前言 下面我们将开始学习模型绑定,通过下面的知识我们将能够理解ASP.NET MVC模型的模型绑定器是如何将http请求中的数据转换成模型的,其中我们重点讲述的是表单数据. 二.正文 1.简单类型绑定 学过一定ASP.NET MVC都会为这个特点所骄傲,就是能够将表单中与同名的参数映射,这相比操作ASP.NET控件来获取值轻便了许多,但是正如上面所说的那样要同名(大小写不区分),下面我们会讲述如何自己去指定. 首先我们在HomeController(如果不存在则创建)中获取表单中的值并显示:

流畅python学习笔记:第十二章:子类化内置类型

子类化内置类型 在python2.2之后,内置类型都可以子类化,但是有一个注意事项:内置类型不会调用用户定义的类覆盖的特殊方法.这个说起来比较绕口,什么意思呢.我们来看下下面的代码: class DopperDict(dict):     def __setitem__(self, key, value):         super(DopperDict,self).__setitem__(key,[value]*2) ⑴ if __name__=="__main__":     d

MFC学习笔记之12:用窗口过程WH_CALLWNDPROC钩子+子类化实现皮肤功能

实现方法: 1.定义自己的控件类,比如CButtonEx:public CButton,实现自绘. 2.安装WH_CALLWNDPROC钩子 a.定义HHOOK全局变量 HHOOK g_WndProcHook=NULL; b.在CXXAPP ::InitInstance()中安装钩子 g_WndProcHook=SetWindowsHookEx( WH_CALLWNDPROC, (HOOKPROC)CallWndProc, NULL, GetCurrentThreadId()); c.在CXXA

前端MVC学习总结——AngularJS验证、过滤器

前端MVC学习总结--AngularJS验证.过滤器 目录 一.验证 二.过滤器 2.1.内置过滤器 2.1.1.在模板中使用过滤器 2.1.2.在脚本中调用过滤函数 2.2.自定义过滤器 三.指令(directive) 3.1.支持AngularJS功能的指令 3.1.1.应用与模块(ng-app) 3.1.2.控制器(ng-Controller) 3.1.3.包含(ng-Include) 3.1.4.不绑定(ngNonBindable) 3.2.扩展表单元素的指令 3.2.1.ng-opti

ASP.NET MVC学习系列(二)-WebAPI请求

继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现数据调用. 继续使用上一文章中的示例,添加一个index.html页面,添加对jquery的引用. 一.无参数Get请求 一般的get请求我们可以使用jquery提供的$.get() 或者$.ajax({type:"get"}) 来实现: 请求的后台Action方法仍为上篇文章中的GetU

Qt多线程学习:创建多线程

[为什么要用多线程?] 传统的图形用户界面应用程序都仅仅有一个运行线程,而且一次仅仅运行一个操作.假设用户从用户界面中调用一个比較耗时的操作,当该操作正在运行时,用户界面一般会冻结而不再响应.这个问题能够用事件处理和多线程来解决. [Linux有线程的概念吗?] 传统的UNIX系统也支持线程的概念,但一个进程里仅仅同意有一个线程,这样多线程就是多进程.Linux下的Posix线程(pthreads)是一种轻量级的进程的移植性实现,线程的调度由内核完毕,每一个线程都有自己的编号.假设使用线程,整体