现在的位置: 首页 > 综合 > 正文

Qt 模型视图编程基础 model/view programming

2017年12月16日 ⁄ 综合 ⁄ 共 2572字 ⁄ 字号 评论关闭

QT4介绍了一系列项视图(item view)类,它提供了一个模型视图(model/view)结构来管理数据和呈现用户的关系。

对于小部分情况,我们不需要动用模型,只通过项视图类就可以完成工作(QListWidgetQTableWidgetQTreeWidget)。例如使用QTableWidget,它其中包含QTableWidgetItem等,可以完成少量数据及操作。但是对于大数据就需要用到模型视图结构。

通常,model/view类分为三部分:models(模型), views(视图) 和 delegates(委托)。它们之间的关系正如图中所示。

 

 

模型:

 

所有的模型都是源自QAbstractItemModel类。它定义了被视图和委托使用的存取数据操作。数据可以通过文件,数据库或者应用组件提供。

QAbstractItemModel提供了足够被tables,liststrees视图灵活使用的接口。当为list数据结构和类table数据结构重写一个新模型时,QAbstractListModelQAbstractTableModel更适合作为起点。

QT提供了一些已经实现好了的models

QStringListModel 是应用来存储简单QString列表项的。

QStandardItemModel是用来管理更复杂的树形结构项的,它的每一项都包含一个专门的数据。

QFileSystemModel提供一个关于文件和路径的本地归档系统(以前有QDirModel, 已被移除,可用QFileSystemodel代替)。

QSqlQueryModel, QSqlTableModel, QSqlRelationalTableModel是用模型视图存取数据库数据操作的。

如果这些标准的模型都不适合你,你可以根据需要来子类化QAbstractItemModel, QAbstractListModel, 或 QAbstractTableModel来完成自己的模型类。

 

 

视图

 

通过为各种不同的视图完整的实现了:

QListView基于展示项的列表

QTableView为一个table模型展示数据

QTreeView展示一个分层列表数据模型的项

每一个类都基于QAbstractItemView的抽象类,尽管这些类都是实现好了的,但还是可以根据需要来子类化。

 

 

委托

 

在模型视图框架中,委托都是来自共同的基类:QAbstractItemDelegate类。

QT4.4起,默认委托被QStyleItemDelegate提供,并且也是Qt的标准视图的默认委托。在视图中QStyleItemDelegateQItemDelegate是可供编辑器画出和提供项的可选择的独立类。用户亦可自定义委托。

 

 

模型视图的使用

 

QListViewQTreeView类是最适合的使用QFileSystemModel的视图类。

下面的例子运行后程序如下:

 

这个例子以最简单的方式使用model,并建立一个QFileSystemModel系统。

int main(int argc, char *argv[])

{

   QApplication a(argc, argv);

   QSplitter *splitter = new QSplitter;

   QFileSystemModel *model = new QFileSystemModel;

   model->setRootPath(QDir::currentPath());

setRootPath(const QString &)告诉模型将当前目录路径呈现给视图。

   QTreeView *tree = new QTreeView(splitter);

   tree->setModel(model);

   tree->setRootIndex(model->index(QDir::currentPath()));

   QListView *list = new QListView(splitter);

   list->setModel(model);

   list->setRootIndex(model->index(QDir::currentPath()));

setModel()为当前的视图设置模型

setRootIndex(const QModelIndex &)view设置根项目索引

   splitter->setWindowTitle("Two views onto the same file system model");

   splitter->show();

Splitter组件添加了这两个视图,并由他来作为主窗口呈现这两个视图。

   a.exec();

   return 0;

}

Dir View Example

另一个简单的例子呈现文件系统。如图:

int main(int argc, char *argv[])

{

   QApplication a(argc, argv);

   QFileSystemModel model;

   model.setRootPath("");

   QTreeView tree;

   tree.setModel(&model);

   // Demonstrating look and feel features

   tree.setAnimated(true);  // 动态效果,在展开和收缩时会有动态的效果,默认false

   tree.setIndentation(25); // 缩进,默认值为20

   tree.setSortingEnabled(true);  // 是否支持排序,当点击定层的header栏时会进行排序,默认是false

   tree.setWindowTitle(QObject::tr("Dir View"));

#if defined(Q_OS_SYMBIAN) || defined(Q_WS_MAEMO_5)

   tree.showMaximized();

#else

   tree.resize(640480);

   tree.show();

#endif

   a.exec();

   return 0;

}

抱歉!评论已关闭.