zoukankan      html  css  js  c++  java
  • 第五十七课、模型视图设计模式(下)------------------狄泰软件学院

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

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

  • 相关阅读:
    面向对象方法与调用
    LeetCode OJ:Spiral Matrix(螺旋矩阵)
    LeetCode OJ:Jump Game(跳跃游戏)
    LeetCode OJ:Word Search(单词查找)
    LeetCode OJ:Majority Element II(主元素II)
    LeetCode OJ:Maximum Subarray(子数组最大值)
    LeetCode OJ:Next Permutation(下一排列)
    LeetCode OJ:Product of Array Except Self(除己之外的元素乘积)
    LeetCode OJ:Remove Duplicates from Sorted Array II(移除数组中的重复元素II)
    LeetCode OJ:Best Time to Buy and Sell Stock II(股票买入卖出最佳实际II)
  • 原文地址:https://www.cnblogs.com/gui-lin/p/6526721.html
Copyright © 2011-2022 走看看