[SOLVED] how to assign a QList<listmodelObjects> to a listview in QML with QQmlListProperty?



  • if i have a class that contains a QList of listmodels (QList<listmodelobjects>), how would i assign a model from that list to a listview in QML?

    class code:
    @class TreeModel : public QAbstractItemModel
    {
    Q_OBJECT
    Q_PROPERTY(QQmlListProperty<ListModel> lists READ lists)

    public:

    enum AnimalRoles {
        TypeRole = Qt::UserRole + 1,
    };
    explicit TreeModel(const QString &data, QObject *parent = 0);
    ~TreeModel();
    
    QVariant data(const QModelIndex &index, int role) const Q_DECL_OVERRIDE;
    Qt::ItemFlags flags(const QModelIndex &index) const Q_DECL_OVERRIDE;
    QVariant headerData(int section, Qt::Orientation orientation,
                        int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;
    QModelIndex index(int row, int column,
                      const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
    QModelIndex parent(const QModelIndex &index) const Q_DECL_OVERRIDE;
    int rowCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
    int columnCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
    
    QStringList getGroups();
    QStringList getFoldersByGroup(const QString &name);
    QStringList getFolderlistByGroupID(QStringList &name);
    void getFolders();
    void populateFrontPage();
    
    QQmlListProperty<ListModel> lists(){
            return QQmlListProperty<ListModel>(this, foldermodels);
    }
    
    
    ********************************************
    ListModel *groupmodel;
    QList<ListModel*> foldermodels;
    QList<ListModel*> filemodels;@
    

    now how would i assign for example, foldermodels.at(0) to a listview in qml?
    i have tried stuff like:
    @
    ListView {
    id: folderlist
    model: treemodel.lists // treemodel.lists.at(0) // treemodel.lists[0]
    delegate: folderDelegate
    contentHeight: contentItem.childrenRect.height
    height: childrenRect.height
    anchors.left: parent.left
    anchors.right: parent.right
    clip: true
    }@

    but i am getting errors like:

    @QMetaProperty::read: Unable to handle unregistered datatype 'QQmlListProperty<ListModel>' for property 'TreeModel::lists'
    QQmlExpression: Expression qrc:/main.qml:54:28 depends on non-NOTIFYable properties:
    TreeModel::lists
    QMetaProperty::read: Unable to handle unregistered datatype 'QQmlListProperty<ListModel>' for property 'TreeModel::lists'
    QQmlExpression: Expression qrc:/main.qml:54:28 depends on non-NOTIFYable properties:
    TreeModel::lists@

    and yes i have registered the Treemodel class containing the QList<modelObjects>.

    i also know the QList is actually populated with the correct models because the view shows the items when i do it like this in main.cpp

    @
    TreeModel model(infile.readAll());
    ListModel *foldermodel = model.foldermodels.at(1) // or (0)
    ctxt->setContextProperty("treemodel", &model);
    ctxt->setContextProperty("foldermodel", foldermodel);@

    Thanks in advance for the help, i really apreciate it!!



  • The error message indicates the error comes from line 54 which I don't see. Further it makes me think the code needs a notifiable type and you have the property set only for READ. I posted in your earlier question an offer for a VIP pass to my latest course which I think might help if you're new to integrating Qt Quick with C++.



  • I think the problem is that the class ListModel is not registered with the QML type system.

    You can register it using "qmlRegisterType":http://doc.qt.io/qt-5/qqmlengine.html#qmlRegisterType:
    @
    #include <QtQml>

    int main(int argc, char *argv[])
    {
    ...

    qmlRegisterType<ListModel>();
    
    ...
    

    }@

    Hope that helps.



  • juddster!! thanks! that did the trick.. now on to the next problem lol :P

    thanks again!


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.