将QAbstractModelList的列表公开给QML

时间:2018-07-10 09:17:11

标签: c++ qt qml models

我正在编写QML / Qt应用程序。我用c ++实现了一个模型。该模型的类是从QAbstractListModel派生的。现在需要将此类的对象放入列表中,并将其公开给QML,以便可以在QML中像这样使用它:

DraggableItemList{
            listModel: listofmodels[0]
}

我试图将对象简单地放入QList并像这样公开QList:

engine.rootContext()->setContextProperty("listofmodels",QVariant::fromValue(modelList));

不幸的是,这导致错误,因为QAbstractListModel是不可复制的。 所以我用每个模型的指针QList进行了尝试:

QList<myModel *> modelList;

但是在qml中,它没有使用模型指针显示模型。还有其他解决方案可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

您必须使用QVariantList,例如,使用APPNOTE中的模型,我们将使用以下内容:

*。cpp

#include "model.h"

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);
    QVariantList modelist;

    for(int i=0; i< 10; i++){
        AnimalModel *model = new AnimalModel;
        model->addAnimal(Animal("Wolf", "Medium"));
        model->addAnimal(Animal("Polar bear", "Large"));
        model->addAnimal(Animal("Quoll", "Small"));
        modelist << QVariant::fromValue(model);
    }

    QQmlApplicationEngine engine;
    engine.rootContext()->setContextProperty("modelist", modelist);
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

*。qml

import QtQuick 2.9
import QtQuick.Window 2.2

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    ListView {
        width: 200; height: 250
        model: modelist[0]
        delegate: Text { text: "Animal: " + type + ", " + size }
    }
}

您可以在以下this example

中找到完整的示例