首页 > 代码库 > 第57课 模型视图设计模式(下)

第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();
}
View Code

//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
View Code

//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();
}
View Code

//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
View Code

//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)视图可以自由解析或者忽略数据的角色信息

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