我需要创建一个QML应用程序,其中包含由xml文件定义的项目页面。必须在C ++中解析xml。每个项目页面都是一个StackView页面,其中包含项目的ListView。页面上的每个项目都有几个定义文本,颜色,大小等的值。
首先,我的DOM模型创建基于Qt Simple DOM Model Example。该模型包含QAbstractItemModel。 我已经使用rootContext-> setContextProperty将C ++模型暴露给QML。 我正在努力在StackView页面之间拆分数据。我假设我需要将不同级别的层次模型(页面父项和项目子项)分配给不同的UserRoles,以便将它们过滤到QML视图,但我很难找到任何合适的例子来解决这个问题。
所以我的问题是:
您能告诉我一个将UserRoles分配给C ++ DOM模型的示例,以及通过UserRole 和层次级别返回项目数据的相关数据方法吗?
或
我是否朝着错误的方向前进,并且有更好的方法来实现这一目标?
答案 0 :(得分:0)
来自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;
}