2013-09-29 52 views
0

我需要创建一个由一个XML文件中定义的项目页面的QML应用。 xml必须在C++中解析。项目的每一页都将是一个StackView页面,其中包含项目的ListView。页面上的每个项目都有说明文字,颜色,大小等显示不同级别的不同QML C++ DOM模型视图

作为开始的几个值,我的DOM模型的创建是基于Qt的简单DOM模型示例。该模型用QAbstractItemModel封装。 我已经暴露使用rootContext-> setContextProperty C++模型以QML。 我与StackView页面之间分割数据挣扎。我假设我需要将层次模型(页面父项和项目子项)的不同级别分配给不同的UserRoles,以便将它们过滤到QML视图中,但我正在努力寻找任何合适的示例来说明如何实现此目的。

所以我的问题是:

你能告诉我到C++ DOM模型和由UserRole的层级返回项数据相关的数据的方法分配的的UserRole的例子?

我是不是走错方向,有一个更好的方式来实现这一目标?

+0

使用XML,为什么? QML文件是像XML这样的文本文件的结构化文档,你不能直接使用它? 如果您想使用xml,为什么不使用XmlListModel QML项目直接在QML中读取您的XML? – gbdivers

+0

@Guillaume稍后需要的附加功能包括验证定义文件的载入模式以及修改和写入文件。因此,DOM模型似乎是最合适的--XmlListModel提供只读模型。 –

回答

0

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; 
} 
相关问题