Verschachtelte Liste in qml: Datenmodelle in Modellen

Ich versuche, ein verschachteltes Kommentarsystem in einer QML-Schnittstelle zu implementieren. Ich habe ein Modell in C ++ (untergeordnet von QAbstractListModel), in dem jedes Element im Modell zwei Werte zurückgibt: Einer ist ein QString und der andere ist eine QVariantMap mit dem Rollennamen "dataMap". Dies funktioniert gut mit einer QML-ListView. Jetzt enthält jede QVariantMap ein Element "data", das außerdem eine QVariantList "children" enthält. Nun werden im Wesentlichen andere QVariantMaps mit der gleichen Struktur aufgelistet. Meine Idee, dies zu implementieren, war die Verwendung eines rekursiven Delegaten in einer QML-ListView. Unten ist die einfachste Version meines Codes.

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
        }
    }
}

Die Struktur meines Modells ist wie folgt:

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);
};

Die ListItem-Klasse ist einfach

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;

Jetzt funktioniert dieser Ansatz aus mehreren Gründen nicht (einer davon ist, dass die Eigenschaft dataMap ist erreichbar alsDate in demKindermode, das von der Standardeigenschaft @ überschrieben wiDate in einem beliebigen QML-Elementtyp). Gibt es eine mögliche Lösung für dieses Problem?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage