Мне нужно создать приложение QML со страницами элементов, которые определены в XML-файле. XML должен быть проанализирован в C ++. Каждая страница элементов будет страницей StackView, содержащей ListView элементов. Каждый элемент на странице имеет несколько значений, определяющих текст, цвет, размер и т. Д.
Для начала, создание моей модели DOM основано на примере модели Qt Simple DOM. Модель обернута с помощью QAbstractItemModel.
Я представил модель C ++ для QML, используя rootContext-> setContextProperty.
Я борюсь с разделением данных между страницами StackView. Я предполагаю, что мне нужно назначить разные уровни иерархической модели (родительский элемент страницы и дочерние элементы) разным пользовательским ролям, чтобы отфильтровать их в представлениях QML, но я изо всех сил пытаюсь найти подходящие примеры того, как это сделать.
Итак, мой вопрос:
Можете ли вы показать мне пример назначения UserRoles для модели DOM C ++ и связанный метод данных для возврата данных элемента по UserRole а также иерархический уровень?
или же
Я иду в неправильном направлении, и есть лучший способ добиться этого?
Хорошо, теперь у меня все получилось. После еще одной игры я решил выбрать данные по имени узла 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;
}
Других решений пока нет …