简介
MVC设计模式包括三个元素:表示数据的模型(Model)、表示用户界面的视图(View)和定义了用户在界面上操作的控制器(Controller)。
与MVC架构相似,QT为了方便程序的开发,引入了模型/视图结构用于完成数据与界面的分离,也就是常用的InterView框架。与传统的MVC模式不同的是,InterView框架把视图和控制器部件结合在一起,使得框架更为简洁。为了灵活地处理用户输入,InterView引入了代理(delegate)。通过使用代理,能够自定义数据条目的显示和编辑方式。
MVD
QT的模型/视图结构分为三部分:
- 模型:与数据源通信,并为其他部件提供接口
- 视图:视图从模型中获得用来引用数据条目的模型索引
- 代理:当编辑条目时,代理和模型直接进行通信。
三者之间均通过信号和槽机制进行通信,他们的关系如下:
- 数据发生改变时,模型发出信号通知视图,视图开始渲染(rendering)
- 用户对界面进行操作,视图发出信号
- 代理发出信号告知模型和视图编辑器目前的状态
典型代码
#include "dialog.h"
#include <QApplication>
#include <QAbstractItemModel>
#include <QAbstractItemView>
#include <QItemSelectionModel>
#include <QDirModel>
#include <QTreeView>
#include <QTableView>
#include <QListView>
#include <QSplitter>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//MVD使用示例
QDirModel model;//文件目录model
QTreeView tree;
QTableView table;
QListView list;
tree.setModel(&model);
table.setModel(&model);
list.setModel(&model);//设置模型
tree.setSelectionMode(QAbstractItemView::MultiSelection);
table.setSelectionModel(tree.selectionModel());//使用与tree对象相同的选择模型
list.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("DirModel");
splitter->show();
return a.exec();
}