QML中的嵌套列表:模型中的数据模型 [英] Nested list in qml: data models in models
问题描述
我正在尝试在QML界面中实现嵌套评论系统.我在C ++中有一个模型(从QAbstractListModel继承),其中模型中的每个项目返回两个值:一个是QString,另一个是带有RoleName"dataMap"的QVariantMap.使用QML ListView可以很好地工作.现在,每个QVariantMap包含一个项数据",该项还包含一个QVariantList子项".现在,这基本上列出了其他具有相同结构的QVariantMap.我实现此目标的想法是在QML ListView中使用递归委托.下面是我的代码的最简单版本.
I am trying to implement a nested comment system in a QML interface. I have a model in C++ (subclassed from QAbstractListModel) in which each item in the model returns two values: one is a QString and the other is a QVariantMap with roleName "dataMap". This works fine with a QML ListView. Now each QVariantMap contains an item "data" which further contains a QVariantList "children". Now this lists basically other QVariantMaps with the same structure. My idea to implement this was to use a recursive delegate in a QML ListView. Below is the simplest version of my code.
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
}
}
}
我的模型的结构如下:
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);
};
ListItem类就是
The ListItem class is simply
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;
现在,由于多种原因,该方法不起作用(其中之一是可以在 childModel dataMap 属性作为 data 访问>,在任何QML项类型中,默认属性 data 都将其覆盖).这个问题有什么可能的解决办法吗?
Now this approach does not work for a number of reasons (one of which is that the property dataMap is accessible as data in the childModel, which is overridden by the default property data in any QML Item type). Any possible solution to this problem?
推荐答案
I have found this very useful article that helped to solve the problem https://lemirep.wordpress.com/2013/04/06/a-practical-case-exposing-qt-c-models-to-qml/.
The approach consists into creating another ListModel (derived from QAbstracListModel) inside the model class. In my example, I replace QVariantMap dataMap()
with another ListModel dataModel()
. Notice that this requires other changes too (which can be found at the link provided)
这篇关于QML中的嵌套列表:模型中的数据模型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!