QML PathView 中的 SetRootIndex

Posted

技术标签:

【中文标题】QML PathView 中的 SetRootIndex【英文标题】:SetRootIndex in QML PathView 【发布时间】:2014-12-25 15:55:31 【问题描述】:

我正在使用 QML PathView 来展示我的模型。这样的模型继承自QStandardItemModel,具有两级数据(父项和子项)。我需要在 PathView 中显示模型的第二级,即选定父级的所有子级。使用QAbstractItemView 这个结果可以通过使用setRootIndex 函数来实现。如何使用PathView 获得相同的结果?

有人可以帮助我吗? 提前致谢。

这里是一个模型示例:

newPetModel::newPetModel()

...
 fillModel();

...
void newPetModel::fillModel()

 QStandardItem* rootItem = invisibleRootItem();
 // groups
 QStandardItem* GroupAnimals = new QStandardItem();
 rootItem->setChild(rootItem->rowCount(), GroupAnimals);
 GroupAnimals->setData(QString("Animals"),nameRole);

 QStandardItem* GroupPlants = new QStandardItem();
 rootItem->setChild(rootItem->rowCount(), GroupPlants);
 GroupPlants->setData(QString("Plants"),nameRole);

 QStandardItem* GroupInsects = new QStandardItem();
 rootItem->setChild(rootItem->rowCount(), GroupInsects);
 GroupInsects->setData(QString("Insects"),nameRole);
 // items
 QStandardItem* Cat = new QStandardItem();
 GroupAnimals->setChild(GroupAnimals->rowCount(), Cat);
 Cat->setData(QString("Cat"),nameRole);
 Cat->setData(QString("qrc:/cat.jpg"),imgRole);

 QStandardItem* Dog = new QStandardItem();
 GroupAnimals->setChild(GroupAnimals->rowCount(), Dog);
 Dog->setData(QString("Dog"),nameRole);
 Dog->setData("qrc:/dog.jpg",imgRole);`enter code here`
 //-----
 QStandardItem* Peas = new QStandardItem();
 GroupPlants->setChild(GroupPlants->rowCount(), Peas);
 Peas->setData(QString("Peas"),nameRole);
 Peas->setData("qrc:/peas.jpg",imgRole);
 //-----
 QStandardItem* Spider = new QStandardItem();
 GroupInsects->setChild(GroupInsects->rowCount(), Spider);
 Spider->setData(QString("Spider"),nameRole);
 Spider->setData("qrc:/peas.jpg",imgRole);

 QStandardItem* Fly = new QStandardItem();
 GroupInsects->setChild(GroupInsects->rowCount(), Fly);
 Fly->setData(QString("Fly"),nameRole);
 Fly->setData("qrc:/fly.jpg",imgRole);

【问题讨论】:

首先,您的模型在 QML 中可用吗?您是否已将其添加为上下文属性? 通过函数 setContextProperty 将模型添加为上下文属性,并设置 PathView 的模型属性。 PathView 显示第一级项目。 【参考方案1】:

QML 适用于列表模型,正如您在您的案例中看到的那样。但是,使用DelegateModel 可以轻松克服此限制。引用文档:

通常不需要创建 DelegateModel。但是,当 QAbstractItemModel 子类用作模型时,它对于操作和访问 modelIndex 很有用。此外,DelegateModel 与 Package 一起用于为多个视图提供代理,并与 DelegateModelGroup 一起用于对代理项进行排序和过滤。

这种 QML 类型有一个属性rootIndex。再次引用文档:

QAbstractItemModel 提供了一个层次结构的数据树,而 QML 只对列表数据进行操作。 rootIndex 允许此模型提供 QAbstractItemModel 中任何节点的子节点

这是您需要设置(和重置)的属性,如链接文档的示例中所述。请注意,使用 DelegateModel 时不应定义 PathView 中的委托。一个工作示例 (visualdatamodel/slideshow.qml) 在路径下的标准框架分发中可用:

Qt/QtXXX/Examples/Qt-5.4/quick/views

最后请注意,DelegateModelVisualDataModel 经常以可互换的方式使用,因为

由于兼容性原因,此类型(VisualDataModel)由 Qt QML 模块提供。 相同的实现现在主要用作 Qt QML 模型中的 DelegateModel 模块。

【讨论】:

DelegateModel 是我需要的。谢谢!对不起我的英语 没问题。查找我的编辑...我记得标准框架分发中有一个示例。这应该可以澄清任何(可能的)疑问。

以上是关于QML PathView 中的 SetRootIndex的主要内容,如果未能解决你的问题,请参考以下文章

QML:如何在 Pathview 中获取当前项目

QML PathView:通过鼠标滚轮更改路径视图的当前索引

qml----Model/View入门PathView

如何在 PathView QML 中保持可见的当前、下一个和之前的项目?

在最后一个元素处停止 Pathview 移动

具有居中当前项的简单 PathView