Qt包含两种模型
Qt提供的两个标准模型是QStandardItemModel和QFileSystemModel。
QStandardItemModel是一个多用途模型,可用于表示列表、表和树视图所需的各种不同的数据结构。同时还保存了数据项。
QFileSystemModel是一个维护目录内容信息的模型。它本身不保存任何数据项,只是表示本地文件系统上的文件和目录。
QFileSystemModel提供了一个现成的模型来进行实验,可以很容易地配置以使用现有数据。使用这个模型,我们可以展示如何为现成的视图设置模型,并探索如何使用模型索引操作数据。
在现有模型中使用视图
QListView和QTreeView类是最适合与QFileSystemModel一起使用的视图。下面给出的示例,在树视图中显示目录的内容,与列表视图中的相同信息相邻。这两个视图共享用户的选择,因此选中的项目在两个视图中都被突出显示。
如下图,设置了一个QFileSystemModel,简单的构造和使用:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);// 创建一个Qt应用程序对象,它管理GUI事件循环和设置
QSplitter *splitter = new QSplitter;// 创建一个QSplitter(窗口部件),它是一个容器,可以用来在窗口中创建多个视图。
QFileSystemModel *model = new QFileSystemModel;// 创建一个QFileSystemModel对象,这是一个文件系统模型,可以用来在树形视图或表格视图中显示文件和目录。
model->setRootPath(QDir::currentPath());// 设置QFileSystemModel的根路径为当前工作目录,setRootPath方法设置模型的文件系统根路径。
创建两个视图,以便以两种不同的方式检查模型中的项:
QTreeView *tree = new QTreeView(splitter);// 创建一个QTreeView对象,这是一个可以显示树形结构的视图。我们将这个视图放入之前创建的QSplitter容器中。
tree->setModel(model);// 设置QTreeView的模型为之前创建的QFileSystemModel模型。这样,QTreeView就会显示QFileSystemModel的内容。
tree->setRootIndex(model->index(QDir::currentPath()));// 设置QTreeView的根索引为当前工作目录。这样,QTreeView就会从当前目录开始显示文件系统内容。
QListView *list = new QListView(splitter);// 创建一个QListView对象,这是一个可以显示列表结构的视图。我们也将这个视图放入之前创建的QSplitter容器中。
list->setModel(model);// 和设置QTreeView一样,我们设置QListView的模型也为QFileSystemModel。
list->setRootIndex(model->index(QDir::currentPath()));// 和设置QTreeView一样,我们设置QListView的根索引为当前工作目录。
视图的构造方式与其他部件相同。要想在视图中显示模型中的项目,只需调用它的setModel()函数,将目录模型作为参数即可。我们在每个视图上调用setRootIndex()函数,从文件系统模型中为当前目录传入一个合适的模型索引,从而过滤模型提供的数据。
这里使用的index()函数是QFileSystemModel唯一的。我们给它提供一个目录,它会返回一个模型索引。
函数的其余部分只是显示splitter部件中的视图,并运行应用程序的事件循环:
splitter->setWindowTitle("Two views onto the same file system model");// 设置splitter(分栏器)的窗口标题为"Two views onto the same file system model",这将显示在splitter窗口的顶部。
splitter->show();// 显示splitter窗口,这将使得窗口在屏幕上可见。
return app.exec();// 执行app应用程序的事件循环,这将使得应用程序开始运行并响应用户的操作。
}
在上面的例子中,我们忽略了如何处理元素的选择。在Item视图中处理选择的部分会更详细地介绍这个主题。
标签:splitter,Qt,QTreeView,模型,视图,model,QFileSystemModel,view From: https://blog.51cto.com/u_16324960/8068237