MVC
Qt的模型/视图结构分为三部分,模型(Model)、视图(View)、代理(Delegate)。
其中,模型与数据源通信,并为其他部件提供接口;而视图从模型中获得用来引用数据条目的模型索引(Model Index)。在视图中,代理负责绘制数据条目,当编辑条目时,代理和模型直接进行通信。
模型/视图/代理之间通过信号与槽进行通信。
关系
- 数据发生改变时,模型发出信号通知视图
- 用户对界面进行操作,视图发出信号
- 代理发出信号告知模型/视图编辑器目前的状态
一、概述
1.1基本概念
1)模型
InterView框架中的所有模型都是基于抽象类QAbstractItemModel类。
2)视图
InterView框架中的所有模型都是基于抽象类QAbstractItemView类。
3)代理
InterView框架中的所有代理都是基于抽象类QAbstractItemDelegate类。
1.2案例
实现简单的目录文件浏览器
#include "mainwindow.h"
#include <QApplication>
#include <QAbstractItemModel>
#include <QAbstractItemView>
#include <QItemSelectionModel>
#include <QDirModel>
#include <QTreeView>
#include <QListView>
#include <QTableView>
#include <QSplitter>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QDirModel model;
QTreeView tree;
QListView list;
QTableView table;
tree.setModel(&model);
list.setModel(&model);
table.setModel(&model);
tree.setSelectionMode(QAbstractItemView::MultiSelection);
list.setSelectionModel(tree.selectionModel());
table.setSelectionModel(tree.selectionModel());
QObject::connect(&tree,SIGNAL(doubleClicked(QModelIndex)),&list,SLOT(setRootIndex(QModelIndex)));
QObject::connect(&tree,SIGNAL(doubleClicked(QModelIndex)),&table,SLOT(setRootIndex(QModelIndex)));
QSplitter *splitter = new QSplitter;
splitter->addWidget(&tree);
splitter->addWidget(&list);
splitter->addWidget(&table);
splitter->setWindowTitle(QObject::tr("Model/View"));
splitter->show();
return a.exec();
}
二、模型(Model)
数据库首先将一些重复的文字字段用数值代码保存,然后通过外键关联操作来查找真实的含义。
2.1案例
实现将数值代码转换为文字的模型来介绍如何使用自定义模型