第五十七课、模型视图设计模式(下)------------------狄泰软件学院

一、不同的视图显示同一个模型中的数据

1、Qt中标准模型定义(例子中使用表格模型)

(1)、获取虚拟根节点

(2)、动态从堆空间申请并创建三个数据项

(3)、分别往三个数据项中放入数据

(4)、将数据项放到模型中

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui/QMainWindow>
#include <QTableView>
#include <QStandardItemModel>
class MainWindow : public QMainWindow
{
    Q_OBJECT
private:
    QStandardItemModel m_standerdModel;
    QTableView m_tableView;
    void initStanderdModel();
    void initTableModel();
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
};

#endif // MAINWINDOW_H
MainWindow.h
#include "MainWindow.h"
#include <QStandardItem>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    initStanderdModel();
    initTableModel();
    m_tableView.setModel(&m_standerdModel);
}
void MainWindow::initStanderdModel()
{
    QStandardItem* root = m_standerdModel.invisibleRootItem();
    QStandardItem* itemA = new QStandardItem();
    QStandardItem* itemB = new QStandardItem();
    QStandardItem* itemC = new QStandardItem();

    itemA->setData("A");//只是往数据项里面放了数据,并没有告诉如何显示
    itemA->setData("Tip A");
    itemA->setData("Help A");
    itemB->setData("B");
    itemB->setData("Tip B");
    itemC->setData("C");
    itemC->setData("Tip B");
    itemC->setData("Help C");

    root->setChild(0, 0, itemA);//itemA、itemB、itemC都是new出来的,这里将数据项
    root->setChild(0, 1, itemB);//加入模型的同时也相当于指定了父组件,不会造成内存泄漏
    root->setChild(1, 0, itemC);

}
void MainWindow::initTableModel()
{
    m_tableView.resize(300,100);
    m_tableView.move(10,10);
    m_tableView.setParent(this);
}
MainWindow::~MainWindow()
{
    
}
MainWindow.cpp
#include <QtGui/QApplication>
#include "MainWindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    
    return a.exec();
}
main.cpp

二、Qt中的数据角色

1、数据角色的概念

(1)、模型中的数据在视图中的用途(显示方式)可能不同

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

(3)、数据角色用于提示视图数据的作用(直接显示、或者做其它用途

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

2、Qt中的数据角色定义

3、数据角色的意义(指导视图如何使用数据

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

(2)、不同的视图可以通过相同的标准显示数据

(3)、注意

A、数据角色只是一个附加的属性,这个属性代表推荐的数据显示方式

B、不同的视图完全可以自由解析或者忽略数据的角色信息(自定义视图时)

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui/QMainWindow>
#include <QTableView>
#include <QTreeView>
#include <QListView>
#include <QStandardItemModel>
class MainWindow : public QMainWindow
{
    Q_OBJECT
private:
    QStandardItemModel m_standerdModel;
    QTableView m_tableView;
    QTreeView m_treeView;
    QListView m_listView;
    void initStanderdModel();
    void initTableModel();
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
};

#endif // MAINWINDOW_H
MainWindow.h
#include "MainWindow.h"
#include <QStandardItem>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent, Qt::WindowContextHelpButtonHint)
{
    initStanderdModel();
    initTableModel();
    m_tableView.setModel(&m_standerdModel);
    m_treeView.setModel(&m_standerdModel);
    m_listView.setModel(&m_standerdModel);
}
void MainWindow::initStanderdModel()
{
    QStandardItem* root = m_standerdModel.invisibleRootItem();
    QStandardItem* itemA = new QStandardItem();
    QStandardItem* itemB = new QStandardItem();
    QStandardItem* itemC = new QStandardItem();
    QStandardItem* itemChild = new QStandardItem();

    itemA->setData("A", Qt::DisplayRole);
    itemA->setData("Tip A", Qt::ToolTipRole);
    itemA->setData("Help A", Qt::WhatsThisRole);
    itemB->setData("B", Qt::DisplayRole);
    itemB->setData("Tip B", Qt::ToolTipRole);
    itemC->setData("C", Qt::DisplayRole);
    itemC->setData("Tip B", 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->setChild(0, 0, itemA);//itemA、itemB、itemC都是new出来的,这里将数据项
    root->setChild(0, 1, itemB);//加入模型的同时也相当于指定了父组件,不会造成内存泄漏
    root->setChild(1, 0, itemC);

}
void MainWindow::initTableModel()
{
    m_tableView.resize(300,100);
    m_tableView.move(10,10);
    m_tableView.setParent(this);

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

    m_listView.resize(300,100);
    m_listView.move(10,230);
    m_listView.setParent(this);
}
MainWindow::~MainWindow()
{
    
}
MainWindow.cpp
#include <QtGui/QApplication>
#include "MainWindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    
    return a.exec();
}
main.cpp

三、小结

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

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

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

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

posted @ 2017-03-10 17:45  lgc202  阅读(523)  评论(0编辑  收藏  举报