第57课 模型视图设计模式(下)

1. Qt中标准模型定义

(1)预期的模型逻辑结构

(2)代码实现

//main.cpp

#include "Widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

//Widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTableView>
#include <QStandardItemModel>

class Widget : public QWidget
{
    Q_OBJECT

    QStandardItemModel m_model;
    QTableView m_tableView;

    void initModel();
    void initView();
public:
    Widget(QWidget *parent = 0);
    ~Widget();
};

#endif // WIDGET_H

//Widget.cpp

#include "Widget.h"
#include <QStandardItem>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    initModel();
    initView();

    m_tableView.setModel(&m_model);
}

void Widget::initModel()
{
    //获取模型中的根节点
    QStandardItem* root = m_model.invisibleRootItem();

    //创建3个数据项
    QStandardItem* itemA = new QStandardItem();
    QStandardItem* itemB = new QStandardItem();
    QStandardItem* itemC = new QStandardItem();

    //itemA中3个数据地位平等,该显示哪个呢?
    //解决方案:数据角色,见后面详解
    itemA->setData("A");
    itemA->setData("Tip A");
    itemA->setData("Help A");

    //往itemB加入两个数据
    itemB->setData("B");
    itemB->setData("Tip B");

    itemC->setData("C");
    itemC->setData("Tip C");
    itemC->setData("Help C");

    //将数据项加入root中
    root->setChild(0, 0, itemA);//第0行0列,取出itemA时按三元组(0,0,root)方式
    root->setChild(0, 1, itemB);
    root->setChild(1, 0, itemC);
}

void Widget::initView()
{
    m_tableView.setParent(this);
    m_tableView.move(10, 10);
    m_tableView.resize(300, 100);

}

Widget::~Widget()
{

}

2. 数据角色概念

(1)模型中的数据在视图中的用途可能不同(如用于display或ToolTip等)

(2)模型必须为数据设置特定的数据角色(数据的附加属性

(3)数据角色用于提示数据在视图中的作用(显示方式)

(4)数据角色是不同视图以统一风格显示数据的标准

3. Qt中的数据角色定义


常量


角色定义


Qt::DisplayRole


作为直接可见的显示信息(QString)


Qt::DecorationRole


以图标的方式进行显示(QIcon, QPixmap)


Qt::EditRole


可编辑的数据信息(QString)


Qt::ToolTipRole


悬浮框中的补充型提示信息(QString)


Qt::StatusTipRole


在状态中显示的提示性信息(QString)


Qt::WhatsThisRole


悬浮框中的详细帮助信息(QString)


Qt::SizeHintRole


数据大小信息(QSize)

4. 数据角色的意义

(1)定义了数据在特定系统下的标准用途

(2)不同的视图可以通过相同标准显示数据。但要注意,数据角色只是一个附加的属性,这个属性代表推荐的数据显示方式,不同视图完全可以自由解析或者忽略数据的角色信息。

【编程实验】数据模型中的角色

//main.cpp

#include "Widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

//Widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTableView>
#include <QListView>
#include <QTreeView>
#include <QStandardItemModel>

class Widget : public QWidget
{
    Q_OBJECT

    QStandardItemModel m_model;
    QTableView m_tableView;
    QListView m_listView;
    QTreeView m_treeView;

    void initModel();
    void initView();
public:
    Widget(QWidget *parent = 0);
    ~Widget();
};

#endif // WIDGET_H

//Widget.cpp

#include "Widget.h"
#include <QStandardItem>
Widget::Widget(QWidget *parent)
    : QWidget(parent, Qt::WindowContextHelpButtonHint) //用于演示显示Help信息
{
    initModel();
    initView();

    //通过不同视图来显示来自同一模型的数据,用于演示模型与视图分离
    m_tableView.setModel(&m_model);//用表格显示数据
    m_listView.setModel(&m_model); //用列表显示数据
    m_treeView.setModel(&m_model); //用树显示数据
}

void Widget::initModel()
{
    //获取模型中的根节点
    QStandardItem* root = m_model.invisibleRootItem();

    //创建4个数据项
    QStandardItem* itemA = new QStandardItem();
    QStandardItem* itemB = new QStandardItem();
    QStandardItem* itemC = new QStandardItem();
    QStandardItem* itemChild = new QStandardItem();

    //itemA中3个数据(利用数据角色来区别数据在视图中的用途)
    itemA->setData("A", Qt::DisplayRole); //用来直接显示
    itemA->setData("Tip A", Qt::ToolTipRole); //Hint
    itemA->setData("Help A", Qt::WhatsThisRole); //帮助提示

    //往itemB加入两个数据
    itemB->setData("B", Qt::DisplayRole);
    itemB->setData("Tip B", Qt::ToolTipRole);

    itemC->setData("C", Qt::DisplayRole);
    itemC->setData("Tip C", Qt::ToolTipRole);
    itemC->setData("Help C", Qt::WhatsThisRole);

    itemChild->setData("Child", Qt::DisplayRole);
    itemChild->setData("Tip Child", Qt::ToolTipRole);
    itemChild->setData("Help Child", Qt::WhatsThisRole);

    itemC->setChild(0, 0, itemChild);

    //将数据项加入root中
    root->setChild(0, 0, itemA);//第0行0列,取出itemA时按三元组(0,0,root)方式
    root->setChild(0, 1, itemB);
    root->setChild(1, 0, itemC);
}

void Widget::initView()
{
    m_tableView.setParent(this);
    m_tableView.move(10, 10);
    m_tableView.resize(300, 100);

    m_listView.setParent(this);
    m_listView.move(10, 120);
    m_listView.resize(300, 100);

    m_treeView.setParent(this);
    m_treeView.move(10, 230);
    m_treeView.resize(300, 100);
}

Widget::~Widget()
{

}

5. 小结

(1)模型中的数据有附加的角色属性

(2)数据角色定义了数据显示的标准方式

(3)数据角色用于提示视图数据的作用

(4)视图可以自由解析或者忽略数据的角色信息

时间: 2024-10-10 12:50:39

第57课 模型视图设计模式(下)的相关文章

第55课 模型视图设计模式

1. 模型视图模式 (1)模型视图设计模式的核心思想 ①模型(数据)与视图(显示)相分离 ②模型对外提供标准接口存取数据(不关心数据如何显示) ③视图自定义数据的显示方式(不关心数据如何组织存储) (2)模型视图模式的直观理解 (3)模型视图模式的工作机制 ①当数据发生改变时,模型发出信号通知视图 ②当用户与视图进行交互时,视图发出信号提供交互信息 2. Qt中的模型-视图类层次结构 (1)Qt中的模型类的层次结构 (2)Qt中的视图类的层次结构 3. 关键技术问题 (1)模型如何为数据提供统一

第62课 模型视图中的委托(下)

1. 委托的本质 (1)为视图提供数据编辑的上下文环境 (2)产生界面元素的工厂类 (3)能够使用和设置模型中的数据 2. 自定义委托类 (1)自定义委托类的继承关系 (2)自定义委托时需要重写的函数 ①createEditor ②updateEditorGeometry ③setEditorData ④setModelData ⑤paint(可选) (3)自定义委托时重写的函数由谁调用? 由于模型视图设计模式,视图中组合了委托对象,既然委托存在于视图内部,就应该由视图来调用(可从上图的函数调用

第61课 模型视图中的委托(上)

1. Qt模型视图对用户输入的处理 (1)传统的MVC设计模式 (2)Qt中的模型视图设计模式如何处理用户输入? ①视图中集成了处理用户输入的功能(即委托) ②视图将用户输入作为内部独立的子功能来实现 ③模型负责组织数据,视图负责显示数据,委托则用于编辑修改数据. 2. 模型视图中的委托 (1)委托(Delegate)是视图中处理用户输入的部件(如编辑框.单选按钮等) (2)视图可以设置委托对象用于处理用户输入 (3)委托对象负责创建和显示用户输入的上下文(内容),如编辑框的创建和显示. (4)

设计模式, mvc 模型视图控制器模式(8)

MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式.这种模式用于应用程序的分层开发. Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO.它也可以带有逻辑,在数据变化时更新控制器. View(视图) - 视图代表模型包含的数据的可视化. Controller(控制器) - 控制器作用于模型和视图上.它控制数据流向模型对象,并在数据变化时更新视图.它使视图与模型分离开. quotes = ('A man is not complete u

Qt 学习之路:模型-视图高级技术

PathView PathView是 QtQuick 中最强大的视图,同时也是最复杂的.PathView允许创建一种更灵活的视图.在这种视图中,数据项并不是方方正正,而是可以沿着任意路径布局.沿着同一布局路径,数据项的属性可以被更详细的设置,例如缩放.透明度等. 使用PathView首先需要定义一个代理和一个路径.除此之外,PathView还可以设置很多其它属性,其中最普遍的是pathItemCount,用于设置可视数据项的数目:preferredHighlightBegin.preferred

[框架模式]经典的模型视图控制器模式MVC

参考:<设计模式> http://blog.csdn.net/u010168160/article/details/43150049 百度百科 引言: Model(模型)是应用程序中用于处理应用程序数据逻辑的部分. 通常模型对象负责在数据库中存取数据. View(视图)是应用程序中处理数据显示的部分. 通常视图是依据模型数据创建的. Controller(控制器)是应用程序中处理用户交互的部分. 通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据. MVC 分层有助于管理复杂的应用程

38.Qt模型/视图结构

1 模型/视图类 InterView框架提供了一些可以直接使用的模型类和视图类,如QStandardModel类,QDirModel类,QStringListModel类,以及QColumnView类,QHeaderView类,QListView类,QTableView类和QTreeView类 简单目录浏览器: 1 #include "mainwindow.h" 2 #include <QApplication> 3 4 #include <QAbstractItem

清华版CG 实验5 OpenGL模型视图变换

1.实验目的: 理解掌握OpenGL程序的模型视图变换. 2.实验内容: (1)阅读实验原理,运行示范实验代码,理解掌握OpenGL程序的模型视图变换: (2)根据示范代码,尝试完成实验作业: 3.实验原理: 在OpenGL程序中,视图变换必须出现在模型变换之前,但可以在绘图之前的任何时候执行投影变换和视口变换. 1.在指定的视图变换之前,应该使用glLoadIdentity()函数把当前矩阵设置为单位矩阵. 2.在载入单位矩阵之后,使用gluLookAt()函数指定视图变换.如果程序没有调用g

学习模型-视图-控制器MVC模式

MVC简介: MVC开始是存在于桌面程序中的,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式.MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式: Model(模型)表示应用程序核心(比如数据库记录列表). View(视图)显示数据(数据库记录). Controller(控制器)处理输入(写入数据库记录). MVC 模式同时提供了对 HTML.