第五十七课、模型视图设计模式(下)------------------狄泰软件学院
一、不同的视图显示同一个模型中的数据
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
#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() { }
#include <QtGui/QApplication> #include "MainWindow.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
二、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
#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() { }
#include <QtGui/QApplication> #include "MainWindow.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
三、小结
(1)、模型中的数据有附加的角色属性
(2)、数据角色定义了数据显示的标准方式
(3)、数据角色用于提示视图数据的作用
(4)、视图可以自由解析或者忽略数据的角色信息(自定义视图时)