OK,现在我已经得到了这是怎么回事。经过一些打我决定选择由XML节点名称的数据 - 我使用“页面” &“项目”。如果其他人在C++中查看分层模型和在QML中查看,我发现实现解决方案的另一个关键要求是QML DelegateModel(正式的VisualDataModel)。下面是直接回答这些问题的片段......
从DomModel.h
public:
enum menuRoles
{
PageNumberRole = Qt::UserRole + 1,
PageNameRole,
ItemNumberRole,
ItemNameRole
};
...
QVariant data(const QModelIndex &index, int role) const;
...
protected:
QHash<int, QByteArray> roleNames() const;
从DomModel.cpp
QVariant DomModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
else
{
DomItem *item = static_cast<DomItem*>(index.internalPointer());
QDomNode node = item->node();
if(node.nodeName() == "Page")
{
switch (role)
{
case PageNumberRole:
return node.attributes().namedItem("number").nodeValue();
break;
case PageNameRole:
return node.attributes().namedItem("name").nodeValue();
break;
default:
return QVariant();
break;
}
}
else if(node.nodeName() == "Item")
{
switch (role)
{
case ItemNumberRole:
return node.attributes().namedItem("number").nodeValue();
break;
case ItemNameRole:
return node.attributes().namedItem("name").nodeValue();
break;
default:
return QVariant();
break;
}
}
else
return QVariant();
}
}
...
QHash<int, QByteArray> DomModel::roleNames() const
{
// This tells the subscribing views what data roles are available
// Any changes must be reflected in the DomModel::data function
QHash<int, QByteArray> roles;
roles[PageNumberRole] = "pageNumber";
roles[PageNameRole] = "pageName";
roles[ItemNumberRole] = "itemNumber";
roles[ItemNameRole] = "itemName";
return roles;
}
使用XML,为什么? QML文件是像XML这样的文本文件的结构化文档,你不能直接使用它? 如果您想使用xml,为什么不使用XmlListModel QML项目直接在QML中读取您的XML? – gbdivers
@Guillaume稍后需要的附加功能包括验证定义文件的载入模式以及修改和写入文件。因此,DOM模型似乎是最合适的--XmlListModel提供只读模型。 –