【Qt】QTreeView 和 QStandardItemModel的关系
QTreeView
和 QAbstractItemModel
(通常是其子类,如 QStandardItemModel
或自定义模型)是 Qt 框架中的两个关键组件,它们之间存在密切的关系。
关系概述
-
QTreeView:
QTreeView
是一个用于显示和编辑层次数据的视图小部件。- 它提供了一种可视化方式来展示树状结构的数据,并支持基本的操作如展开/折叠节点、选择节点等。
-
QAbstractItemModel(或其子类,例如
QStandardItemModel
):- 模型是存储和管理数据的组件。它提供了数据访问的方法,包括获取项的数量、读取和写入数据等。
QAbstractItemModel
是一个抽象基类,通常使用它的具体子类(如QStandardItemModel
)来实现。
关联方式
QTreeView
和模型之间的关联是通过 setModel()
方法完成的。QTreeView
需要知道数据如何获取和更新,而模型提供这些信息。以下是一个简单的示例,说明如何将 QTreeView
与 QStandardItemModel
关联起来。
示例代码
#include <QApplication>
#include <QTreeView>
#include <QStandardItemModel>
#include <QVBoxLayout>
#include <QWidget>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
// 创建主窗口和布局
QWidget window;
QVBoxLayout* layout = new QVBoxLayout(&window);
// 创建 QTreeView 和 QStandardItemModel
QTreeView* treeView = new QTreeView;
QStandardItemModel* model = new QStandardItemModel;
// 设置模型数据
QStandardItem* rootItem = model->invisibleRootItem();
// 添加一些示例项
QStandardItem* item1 = new QStandardItem("Parent 1");
rootItem->appendRow(item1);
QStandardItem* child1_1 = new QStandardItem("Child 1-1");
QStandardItem* child1_2 = new QStandardItem("Child 1-2");
item1->appendRows({child1_1, child1_2});
// 将模型与视图关联
treeView->setModel(model);
// 添加到布局并显示窗口
layout->addWidget(treeView);
window.setLayout(layout);
window.show();
return app.exec();
}
详细解释
-
创建 QTreeView 和 QStandardItemModel:
QTreeView
是一个用于展示层次数据的视图部件。QStandardItemModel
是一种方便使用的基本模型,它基于QStandardItem
来组织和存储数据。
-
设置模型数据:
- 使用
invisibleRootItem()
获取模型中的隐形根项,并通过这个根项添加子项来构建树状结构。
- 使用
-
关联视图与模型:
- 调用
treeView->setModel(model)
方法,将模型与视图关联。这使得QTreeView
可以访问和显示由模型管理的数据。
- 调用
-
展示数据:
- 将
QTreeView
添加到布局中,并设置主窗口的布局。 - 显示主窗口并启动事件循环。
- 将
总结
- QTreeView:负责可视化层次结构数据,提供用户交互(如展开/折叠、选择等)。
- QAbstractItemModel(或其子类):管理实际的数据存储和访问逻辑。
通过将 QTreeView
与模型关联起来,可以轻松地在界面上展示复杂树状结构的数据。这种分离的架构使得数据管理和视图显示更加清晰和灵活。