2013-09-29 3 views
0

Мне нужно создать приложение QML со страницами элементов, которые определяются XML-файлом. Xml должен быть проанализирован на C++. Каждая страница элементов будет страницей StackView, содержащей ListView элементов. Каждый элемент на странице имеет несколько значений, определяющих текст, цвет, размер и т. Д.Показать различные уровни модели DOM C++ в разных представлениях QML

Вначале мое создание модели DOM основано на примере модели Qt Simple DOM. Модель завернута в QAbstractItemModel. Я выставил модель C++ для QML, используя rootContext-> setContextProperty. Я борюсь с разделением данных между страницами StackView. Я предполагаю, что мне нужно назначить разные уровни иерархической модели (родительских и дочерних элементов страницы) различным UserRoles, чтобы отфильтровать их в представлениях QML, но я изо всех сил пытаюсь найти подходящие примеры того, как это сделать.

Так что мой вопрос:

Может ли вы показать мне пример назначения UserRoles к ++ DOM Model C и связанному с ним способом передачи данных для возвращения данных элемента по UserRole и иерархического уровня?

или

Собираюсь ли я в неправильном направлении, и есть лучший способ для достижения этой цели?

+0

Почему с помощью XML? QML-файлы - это структурированный документ в текстовом файле, таком как XML, вы не можете использовать его напрямую? Если вы хотите использовать xml, почему бы вам не использовать элемент XmlListModel QML для чтения XML непосредственно в QML? – gbdivers

+0

@Guillaume Дополнительная функциональность, требуемая позже, включает проверку файла определения при загрузке по схеме, а также модификацию и запись файла. Поэтому модель DOM выглядит как наилучшая подгонка - XmlListModel предоставляет модель только для чтения. –

ответ

0

ОК, теперь у меня все получилось. После нескольких игр я решил выбрать данные по имени xml Node - я использовал «Страница» & «Item». Если кто-то еще смотрит на иерархические модели в 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; 
} 
Смежные вопросы