dal*_*t97 5 c++ qt listview models qml
我试图在QML接口中实现嵌套注释系统.我有一个C++模型(从QAbstractListModel继承),其中模型中的每个项都返回两个值:一个是QString,另一个是带有roleName"dataMap"的QVariantMap.这适用于QML ListView.现在每个QVariantMap都包含一个"data"项,它还包含一个QVariantList"children".现在,这基本上列出了具有相同结构的其他QVariantMaps.我实现这个的想法是在QML ListView中使用递归委托.以下是我的代码的最简单版本.
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
}
}
}
Run Code Online (Sandbox Code Playgroud)
我模型的结构如下:
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);
};
Run Code Online (Sandbox Code Playgroud)
ListItem类很简单
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;
Run Code Online (Sandbox Code Playgroud)
现在,这种方法不适用于一些原因(其中之一是,物业工作的数据图是可访问的数据在childModel,这是默认属性覆盖的数据在任何QML项目类型).这个问题的任何可能解决方案?
我发现这篇非常有用的文章有助于解决问题https://lemirep.wordpress.com/2013/04/06/a-practical-case-exusing-qt-c-models-to-qml/。该方法包括在模型类中创建另一个 ListModel(从 QAbstracListModel 派生)。在我的示例中,我替换QVariantMap dataMap()为另一个ListModel dataModel(). 请注意,这还需要其他更改(可以在提供的链接中找到)