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?