qml中的嵌套列表:模型中的数据模型

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项目类型).这个问题的任何可能解决方案?

dal*_*t97 1

我发现这篇非常有用的文章有助于解决问题https://lemirep.wordpress.com/2013/04/06/a-practical-case-exusing-qt-c-models-to-qml/。该方法包括在模型类中创建另一个 ListModel(从 QAbstracListModel 派生)。在我的示例中,我替换QVariantMap dataMap()为另一个ListModel dataModel(). 请注意,这还需要其他更改(可以在提供的链接中找到)