SetRootIndex in QML PathView

SetRootIndex in QML PathView

本文关键字:PathView QML in SetRootIndex      更新时间:2023-10-16

我正在使用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 适用于列表模型,正如您在案例中看到的那样。但是,通过使用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提供