Lista anidada en qml: modelos de datos en modelos
Estoy tratando de implementar un sistema de comentarios anidados en una interfaz QML. Tengo un modelo en C ++ (subclasificado de QAbstractListModel) en el que cada elemento del modelo devuelve dos valores: uno es un QString y el otro es un QVariantMap con roleName "dataMap". Esto funciona bien con un QML ListView. Ahora cada QVariantMap contiene un elemento "datos" que además contiene una QVariantList "hijos". Ahora esto enumera básicamente otros QVariantMaps con la misma estructura. Mi idea para implementar esto fue usar un delegado recursivo en un QML ListView. A continuación se muestra la versión más simple de mi código.
ListView{
id: commentsList
anchors.fill: parent
model: commentsModel
delegate: commentsDelegate
}
Component{
id: commentsDelegate
ColumnLayout{
Rectangle{
width: 600
height: 200
Text {
id: bodyText
text: dataMap.body
anchors.centerIn: parent
Component.onCompleted: console.debug(text)
}
}
ListView{
id: childList
property var childModel: dataMap.replies.data.children // QVariantList exposed to QML
x: 15
interactive: false
model: childModel
anchors.fill: parent
delegate: commentsDelegate
}
}
}
La estructura de mi modelo es la siguiente:
class ListModel : public QAbstractListModel
{
Q_OBJECT
public:
ListModel(){}
explicit ListModel(QObject* parent =0);
~ListModel();
QHash<int, QByteArray> roleNames() const;
QVariant data(const QModelIndex & index, int role) const;
int rowCount(const QModelIndex &parent) const;
void addItem(ListItem item);
void clearModel();
private:
QList<ListItem> m_itemsList;
signals:
void dataChanged(const QModelIndex & topLeft, const QModelIndex & bottomRight);
};
La clase ListItem es simplemente
class ListItem
{
public:
ListItem(QObject* parent = 0) : QObject(parent) {}
virtual ~ListItem() {}
ListItem(const QString & type, const QVariantMap & dataMap);
QString type() const;
QVariantMap dataMap() const;
private:
QString m_type;
QVariantMap m_dataMap;
Ahora este enfoque no funciona por varias razones (una de las cuales es que la propiedaddataMap es accesible comodatos en elmodelo infantil, que se reemplaza por la propiedad predeterminadadatos en cualquier tipo de elemento QML). ¿Alguna posible solución a este problema?