Qt--模式视图设计

一.模型视图设计模式

A.模型视图设计模式
1.模型与视图相分离
2.模型对外提供标准接口存取数据(不关心数据如何显示)
3.视图自定义数据的显示方式(不关系数据如何组织存储)
模型视图模式的直观理解

模型视图的工作机制
1.当数据发生改变时--模型发出信号通知视图
2.当用户与视图进行交互时--视图发出信号提供交互信息
Qt中的模型类层次结构

QAbstractItemModel类为项模型类提供抽象接口.QAbstractItemModel类定义项模型必须使用的标准接口,以便能够与模型/视图体系结构中的其他组件进行互操作。它不应该直接实例化。相反,您应该将其子类化以创建新模型。QAbstractItemModel类是Model / View Classes之一,是Qt模型/视图框架的一部分。它可以用作QML中项视图元素的基础数据模型或Qt Widgets模块中的项视图类。如果您需要一个模型用于项目视图,例如QML的List View元素或C ++小部件QListView或QTableView,您应该考虑子类化QAbstractListModel或QAbstractTableModel而不是此类。底层数据模型作为表层次结构公开给视图和委托。如果不使用层次结构,则模型是行和列的简单表。每个项目都有一个由QModelIndex指定的唯一索引
Qt中视图类的层次结构

QAbstractItemView类是使用QAbstractItemModel的每个标准视图的基类。QAbstractItemView是一个抽象类,本身不能实例化。?它提供了一个标准接口,通过信号和插槽机制与模型进行互操作,使子类能够随着模型的变化保持最新。?此类为键盘和鼠标导航,视口滚动,项目编辑和选择提供标准支持。
模型视图编程示例

树状视图与模型的代码示例

Widget.cpp
#include "Widget.h"
#include <QDir>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    m_treeView.setParent(this);
    m_treeView.move(10, 10);
    m_treeView.resize(500, 300);

    m_fsModel.setRootPath(QDir::currentPath());//当前路径下

    m_treeView.setModel(&m_fsModel);//模型与视图的连接

    m_treeView.setRootIndex(m_fsModel.index(QDir::currentPath()));
}

Widget::~Widget()
{

}

Widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QFileSystemModel>
#include <QTreeView>

class Widget : public QWidget
{
    Q_OBJECT

    QFileSystemModel m_fsModel;
    QTreeView m_treeView;//树状视图
public:
    Widget(QWidget *parent = 0);
    ~Widget();
};

#endif // WIDGET_H

运行的结构如图所示

B.模型视图设计模式
1.模型定义标准接口(成员函数)对数据进行访问
2.视图通过标准接口获取数据并定义显示方式
3.模型使用信号与槽的机制通知视图数据变化
4.模型中的数据都是以层次结构表示的
C.模型中的索引
1.模型索引时数据与视图分离的重要机制
2.模型中的数据使用唯一的索引来访问
3.QModelIndex是Qt中的模型索引类--包含具体数据的访问途径,包含一个指向模型的指针

索引中的行与列--线性模型可以使用(row,column)作为数据索引
模型中数据索引的通用方式--三元组(row,column,parent)

模型中数据索引的通用方式

D.Q:不同的视图如何显示同一个模型中的数据?
Qt中标准模型定义


数据角色的概念
1.模型中的数据在视图中的用途可能不同
2.模型必须为数据设置特定数据角色
3.数据角色用于提示视图数据的作用
4.数据角色是不同视图以统一风格显示数据的标准
Qt中的数据角色定义

数据角色的意义--定义了数据在特定系统下的标准用途,不同的视图可以通过相同标准显示数据

原文地址:https://blog.51cto.com/13475106/2430093

时间: 2025-01-12 04:50:55

Qt--模式视图设计的相关文章

QT 模型/视图 编程 委托篇

委托类 概述 与模型-视图-控制器模式不同,模型/视图设计不包括用于管理与用户交互的完全独立的组件.通常,视图负责向用户表示模型数据,并处理用户输入.为了在获取输入的方式上允许一定的灵活性,交互由委托执行.这些组件提供输入功能,并负责在某些视图中呈现各个项.控制委托的标准接口在QAbstractItemDelegate类中定义. 委托应该能够通过实现paint()和sizeHint()函数来呈现它们自己的内容.然而,简单的基于widget的委托可以子类化QItemDelegate而不是QAbst

QT开发(八)——QT单元视图组件

QT开发(八)--QT单元视图组件 QT中有四种单元视图组件,分别为列表视图QListView.树形视图QTreeView.表格视图QTableView.列视图QColumnView. 一.QListView列表视图 1.QListView组件简介 QListView列表视图,继承自QAbstractItemView.QListView是基于模型的列表/图标视图,不显示表头和表框,为Qt的模型/视图结构提供了更灵活的方式. 2.QListView组件属性 QListView组件属性设置: A.n

Qt的皮肤设计(Style Sheet)

原地址:http://blog.csdn.net/lastsoup/article/details/7043124 Qt的皮肤设计,也可以说是对Qt应用程序的界面美化,Qt使用了一种类CSS的样式规则QSS. 一.Style Sheet的应用 1.直接在程序代码中设置样式,利用setStyleSheet()方法 widget->setStyleSheet("color:red");     //widget内字体颜色为红色 widget->->setStyleShee

以DDD为开发模式的设计开发步骤可以是

以DDD为开发模式的设计开发步骤可以是:1)分析需求:2)画出用例图,系统中各个角色如何使用系统,也包括外部系统如何使用系统,也包括系统中到某个时间点自动启动的某些功能(此时角色就是时间):3)针对各个用例图,就知道了系统使用的各种业务场景,同时也明确了系统的边界,从而就明确了领域模型的边界:4)在领域模型的边界内划分聚合,找出每个聚合的边界,找出边界内的聚合根,实体,值对象:这步是难点.这里一定不能混淆的一个概念是,领域建模不是以用户为中心的建模,而是以用户的需求为中心的建模.所以要努力寻找各

QT——模型/视图(model/view)

数据项中引入模型/视图架构,可以方便的将数据与表现层分开. ------------------------------------- 模型Model:一般来说,Model里面并不真正存储数据(数据少的话也可以直接存储在Model里),只是负责从诸如磁盘文件,数据库,网络通讯等获得源数据,并提供给View,View对数据进行修改,然后再通过Model更新源数据. Model 另一个重要工作时为源数据添加索引(ModelIndex).列表形式采用row/colum编号,树形式为建立父子间的层次关系

Qt delete & deletelater设计

在C++中学习过程中,我们都知道: delete 和 new 必须 配对使用(一 一对应):delete少了,则内存泄露,多了麻烦更大. Qt作为C++的库,显然是不会违背C++的前述原则的.可是: 在Qt中,我们很多时候都疯狂地用new,却很少用delete,缺少的 delete 去哪儿了?! 注:本文暂不涉及智能指针(smart pointer)相关的东西,你可以考虑 Qt 智能指针学习 一文 Qt半自动的内存管理 在Qt中,以下情况下你new出的对象你可以不用 亲自去delete (但你应

Qt模型/视图中的data和headerData

QAbstractItemModel QAbstractItemModel是一个抽象类,该抽象类未实现的纯虚方法有 QModelIndex QAbstractItemModel::index(int row, int column, const QModelIndex & parent = QModelIndex()) const [pure virtual] QModelIndex QAbstractItemModel::parent(const QModelIndex & index)

hibernate中一对多关系模式的设计

hibernate中一对多的关系模式的设计 注解应该交由多的一方维护和管理. 例如:bbs的模块设计 三个表 版块表(category) .主题帖表(topic)和回帖表(msg) 他们之间的对应关系是:一个版块对应多个主题帖,一个主题帖有多个回复贴. 以下是对应的建表语句. CREATE TABLE `category` ( `id` int(11) NOT NULL auto_increment, `name` varchar(255) default NULL, PRIMARY KEY (

结对编程总结——基于QT的UI设计

之前在做个人项目的时,使用的是C++语言,因此在结对编程的UI设计选用了QT来进行处理. 用户注册功能实现:将用户名及密码储存在当前目录的一个txt文件中,通过文件的读写操作来进行用户的注册.其中验证码的发送使用的是秒赛云系统, 在添加Libcurl时QT对于外部库的链接遇到了不少麻烦. 修改密码功能实现:通过文件读写与一些判断语句实现. 题目生成:没有采取个人项目随机数生成题目的方式,而是建立题库,对于题库中的题目进行随机生成.这对于试卷系统的管理,题目正确的判断, 查重等方面都更加方便. Q