38.Qt模型/视图结构

1  模型/视图类

  InterView框架提供了一些可以直接使用的模型类和视图类,如QStandardModel类,QDirModel类,QStringListModel类,以及QColumnView类,QHeaderView类,QListView类,QTableView类和QTreeView类

简单目录浏览器:

 1 #include "mainwindow.h"
 2 #include <QApplication>
 3
 4 #include <QAbstractItemModel>
 5 #include <QAbstractItemView>
 6 #include <QItemSelectionModel>
 7
 8 #include <QDirModel>
 9 #include <QTreeView>
10 #include <QListView>
11 #include <QTableView>
12 #include <QSplitter>
13
14 int main(int argc, char *argv[])
15 {
16     QApplication a(argc, argv);
17 //    MainWindow w
18 //    w.show();
19
20     //新建一个QDirModel对象,为数据访问做准备,QDirModel的创建还可以设置过滤器
21     //即只有符合条件的文件或目录才可被访问
22     //QDirModel类继承自QAbstractItemModel类,为访问本地系统提供数据模型,它提供了如
23     //新建,删除,创建目录等一系列与文件操作相关的函数
24     QDirModel model;
25
26     //新建三种不同的View对象,以便文件目录可以以三种不同的方式显示
27     QTreeView tree;
28     QListView list;
29     QTableView table;
30
31     //设置View对象的Model为QDirModel对象的model
32     tree.setModel(&model);
33     list.setModel(&model);
34     table.setModel(&model);
35
36     //设置QTreeView对象的选择方式为多选
37     //QAbstractItemView提供了五种选择模式,QAbstractItem View::SingleSelection.
38     //QAbstractItemView::NoSelection,QAbstractItemView::ContiguousSelection
39     //QAbstractItemView::ExtendedSelection和QAbstractItemView::MultiSelection
40     tree.setSelectionMode(QAbstractItemView::MultiSelection);
41     //设置QTableView对象与QTreeView对象使用相同的选择模型
42     list.setSelectionModel(tree.selectionModel());
43     table.setSelectionMode(tree.selectionMode());
44
45     //为了实现双击QTreeView对象中的某个目录时,QListView对象和QTableView对象显示此选定目录
46     //下的所有文件和目录,需要连接QTreeView对象的doubleClicked()信号与QListView对象的
47     //setRootIndex()槽函数
48     QObject::connect(&tree,SIGNAL(doubleClicked(QModelIndex)),&list,
49                      SLOT(setRootIndex(QModelIndex)));
50     QObject::connect(&tree,SIGNAL(doubleClicked(QModelIndex)),&table,
51                      SLOT(setRootIndex(QModelIndex)));
52
53     QSplitter *splitter = new QSplitter;
54     splitter->addWidget(&tree);
55     splitter->addWidget(&list);
56     splitter->addWidget(&table);
57     splitter->setWindowTitle(QObject::tr("Model/view"));
58     splitter->show();
59
60     return a.exec();
61 }


2  模型

  实现自定义模型可以通过QAbstractItemModel类继承,也可以通过QAbstractListModel和QAbstractTableModel类继承实现列表模型或表格模型;

代码示例:

  • modelx.h

     1 #ifndef MODELEX_H
     2 #define MODELEX_H
     3
     4 #include <QAbstractTableModel>
     5 #include <QVector>
     6 #include <QMap>
     7 #include <QStringList>
     8 #include <QObject>
     9
    10 class modelex:public QAbstractTableModel
    11 {
    12 public:
    13     explicit modelex(QObject *parent=0);
    14
    15     virtual int rowCount(const QModelIndex &parent=QModelIndex()) const;
    16     virtual int columnCount(const QModelIndex &parent=QModelIndex()) const;
    17
    18     QVariant data(const QModelIndex &index, int role) const;
    19     //返回表头的函数
    20     QVariant headerData(int section,Qt::Orientation orientation,int role)const;
    21
    22 private:
    23     QVector<short> army;
    24     QVector<short> weaponType;
    25
    26     //数值-文字映射
    27     QMap<short,QString> armyMap;
    28     QMap<short,QString> weaponTypeMap;
    29
    30     QStringList weapon;
    31     QStringList header;
    32
    33     //完成表格数据的初始化填充
    34     void populateModel();
    35 };
    36
    37 #endif // MODELEX_H
  • modelx.cpp

      1 #include "modelex.h"
      2 #include "modelex.h"
      3 modelex::modelex(QObject *parent):
      4     QAbstractTableModel(parent)
      5 {
      6     //创建映射
      7     armyMap[1]=tr("空军");
      8     armyMap[2]=tr("海军");
      9     armyMap[3]=tr("陆军");
     10     armyMap[4]=tr("海军陆战队");
     11
     12     weaponTypeMap[1]=tr("轰炸机");
     13     weaponTypeMap[2]=tr("战斗机");
     14     weaponTypeMap[3]=tr("航空母舰");
     15     weaponTypeMap[4]=tr("驱逐舰");
     16     weaponTypeMap[5]=tr("直升机");
     17     weaponTypeMap[6]=tr("坦克");
     18     weaponTypeMap[7]=tr("两栖攻击舰");
     19     weaponTypeMap[8]=tr("两栖战车");
     20
     21     //绘制模型
     22     populateModel();
     23 }
     24
     25
     26
     27 //获取模型的行数
     28 int modelex::rowCount(const QModelIndex &parent) const
     29 {
     30     return army.size();
     31 }
     32
     33 //返回模型的列数
     34 int modelex::columnCount(const QModelIndex &parent) const
     35 {
     36     return 4;
     37 }
     38
     39 //返回指定索引的数据,即将数值映射为文字
     40 //循环把模型的每行每列给绘制了(函数名不能换成其他名字)
     41 QVariant modelex::data(const QModelIndex &index, int role) const
     42 {
     43     if(!index.isValid())
     44     {
     45         return QVariant();
     46     }
     47
     48     //模型中的条目可以有不同个角色,这样就可以在不同的情况下提供不同的数据.
     49     //如,Qt::DisplayRole用来存取视图中显示的文字,角色由枚举类Qt::ItemDataRole定义
     50     //Qt::DisplayRole   显示文字
     51     //Qt::DecorationRole   绘制装饰数据(通常是图标)
     52     //Qt::EditRole   在编辑器中编辑的数据
     53     //Qt::ToolTipRole   工具提示
     54     //Qt::StatusTipRole   状态栏提示
     55     //Qt::WhatsThisRole   What‘s This文字
     56     //Qt::SizeHintRole   尺寸提示
     57     //Qt::FontRole   默认代理的绘制使用的字体
     58     //Qt::TextAlignmentRole   默认代理的对齐方式
     59     //Qt::BackgroundRole   默认代理的背景画刷
     60     //Qt::ForegroundRole   默认代理的前景画刷
     61     //Qt::CheckStateRole   默认代理的检查框状态
     62     //Qt::UserRole   用户自定义的数据的起始位置
     63     if(role==Qt::DisplayRole)
     64     {
     65         //遍历没一列
     66         switch(index.column())
     67         {
     68         case 0:
     69             //当前行数对应的军队
     70             return armyMap[army[index.row()]];
     71             break;
     72         case 1:
     73             //当前行数对应的类型,以及此类型对应的武器种类
     74             return weaponTypeMap[weaponType[index.row()]];
     75         case 2:
     76             //当前行数对应的武器
     77             return weapon[  index.row()  ];
     78         default:
     79             return QVariant();
     80         }
     81     }
     82     return QVariant();
     83 }
     84
     85 //返回固定的表头数据,设置水平表头的标题(内部循环实现)
     86 QVariant modelex::headerData(int section, Qt::Orientation orientation, int role) const
     87 {
     88     if(role==Qt::DisplayRole&&orientation==Qt::Horizontal)
     89         return header[section];
     90
     91     return QAbstractTableModel::headerData(section,orientation,role);
     92 }
     93
     94 //绘制
     95 void modelex::populateModel()
     96 {
     97     //表头
     98     header<<tr("军种")<<tr("武器种类")<<tr("武器")<<tr("测试");
     99     //军队
    100     army<<1<<2<<3<<4<<2<<4<<3<<1;
    101     //武器种类
    102     weaponType<<1<<3<<5<<7<<4<<8<<6<<3;
    103     //武器
    104     weapon<<tr("B-2")<<tr("尼米兹级")<<tr("黄蜂级")<<tr("阿利伯克级")
    105          <<tr("阿帕奇")<<tr("AAAV")<<tr("M1A1")<<tr("F-22");
    106 }
  • main.cpp

     1 #include <QApplication>
     2
     3 #include "modelex.h"
     4 #include <QTableView>
     5
     6 int main(int argc, char *argv[])
     7 {
     8     QApplication a(argc, argv);
     9
    10     modelex modleEx;
    11     QTableView view;
    12     view.setModel(&modleEx);
    13     view.setWindowTitle(QObject::tr("模型示例"));
    14     view.resize(400,400);
    15     view.show();
    16     return a.exec();
    17 }

原文地址:https://www.cnblogs.com/xiaochi/p/8850325.html

时间: 2024-08-05 13:49:10

38.Qt模型/视图结构的相关文章

Qt模型/视图、委托

MVC视图和控制器对象相结合,其结果是模型/视图结构,仍然分离了数据与呈现给用户的方式,使得它可以在几个不同的视图中显示相同的数据,并实现新类型的视图而无需改变底层的数据结构.为了灵活的处理数据输入,则引入委托的概念.在此框架中引入委托的有点事:允许项目数据显示和自定义编辑. 模型与数据源进行通信,在这个体系结构中为其它组件提供了一个接口.通信的性质依赖于数据源的类型以及模型的实现方式. 视图从模型中得到模型索引,这些都是引用到数据项.通过为模型提供模型索引,视图可以从数据远中检索数据项. 在标

QT——模型/视图(model/view)

数据项中引入模型/视图架构,可以方便的将数据与表现层分开. ------------------------------------- 模型Model:一般来说,Model里面并不真正存储数据(数据少的话也可以直接存储在Model里),只是负责从诸如磁盘文件,数据库,网络通讯等获得源数据,并提供给View,View对数据进行修改,然后再通过Model更新源数据. Model 另一个重要工作时为源数据添加索引(ModelIndex).列表形式采用row/colum编号,树形式为建立父子间的层次关系

Qt模型/视图中的data和headerData

QAbstractItemModel QAbstractItemModel是一个抽象类,该抽象类未实现的纯虚方法有 QModelIndex QAbstractItemModel::index(int row, int column, const QModelIndex & parent = QModelIndex()) const [pure virtual] QModelIndex QAbstractItemModel::parent(const QModelIndex & index)

QT 模型/视图 编程 委托篇

委托类 概述 与模型-视图-控制器模式不同,模型/视图设计不包括用于管理与用户交互的完全独立的组件.通常,视图负责向用户表示模型数据,并处理用户输入.为了在获取输入的方式上允许一定的灵活性,交互由委托执行.这些组件提供输入功能,并负责在某些视图中呈现各个项.控制委托的标准接口在QAbstractItemDelegate类中定义. 委托应该能够通过实现paint()和sizeHint()函数来呈现它们自己的内容.然而,简单的基于widget的委托可以子类化QItemDelegate而不是QAbst

第55课 模型视图设计模式

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

QT开发(八)——QT单元视图组件

QT开发(八)--QT单元视图组件 QT中有四种单元视图组件,分别为列表视图QListView.树形视图QTreeView.表格视图QTableView.列视图QColumnView. 一.QListView列表视图 1.QListView组件简介 QListView列表视图,继承自QAbstractItemView.QListView是基于模型的列表/图标视图,不显示表头和表框,为Qt的模型/视图结构提供了更灵活的方式. 2.QListView组件属性 QListView组件属性设置: A.n

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

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

Qt之模型/视图(委托)

# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' from PyQt4.Qt import * from PyQt4.QtGui import * from PyQt4.QtCore import * import sys,os #视图和委托 """ 视图.在 model/view 架构中,视图是数据从模型到最终用户的途径.数据通过视图向用户进行显示. 此时,这种显示方式不必须同模型的存储结构相

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

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