在不同的QML视图中显示不同级别的C ++ DOM模型

时间:2013-09-29 19:16:30

标签: c++ qt model qml hierarchical

我需要创建一个QML应用程序,其中包含由xml文件定义的项目页面。必须在C ++中解析xml。每个项目页面都是一个StackView页面,其中包含项目的ListView。页面上的每个项目都有几个定义文本,颜色,大小等的值。

首先,我的DOM模型创建基于Qt Simple DOM Model Example。该模型包含QAbstractItemModel。 我已经使用rootContext-> setContextProperty将C ++模型暴露给QML。 我正在努力在StackView页面之间拆分数据。我假设我需要将不同级别的层次模型(页面父项和项目子项)分配给不同的UserRoles,以便将它们过滤到QML视图,但我很难找到任何合适的例子来解决这个问题。

所以我的问题是:

您能告诉我一个将UserRoles分配给C ++ DOM模型的示例,以及通过UserRole 层次级别返回项目数据的相关数据方法吗?

我是否朝着错误的方向前进,并且有更好的方法来实现这一目标?

1 个答案:

答案 0 :(得分:0)

好的,我现在已经开始了。经过多次播放后,我决定按xml节点名称选择数据 - 我使用了“Page”& “项目”。如果其他人正在研究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;
}