使用QList <myobject *> </myobject *>调用setContextProperty()

时间:2013-06-13 09:16:47

标签: c++ qml qt5 qtquick2

我将代码基于documentation of Qt Quick 2.0中的示例,以便从C ++动态地向我的QML中的ListModel提供数据。

MyModel.h

class MyObject: public QObject
{
  Q_OBJECT

  Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)

  public:
    MyObject(QObject *parent=0);
    ~MyObject();

    QString name() const;
    void setName(const QString &name);

    QString deviceName;

  Q_SIGNALS:
    void nameChanged();
};

QML文件

import QtQuick 2.0

ListView {
    width: 100; height: 100

    model: myModel
    delegate: Rectangle {
        height: 25
        width: 100
        Text { text: name }
    }
}

在我的 Main.cpp 中,我现在创建了一个QList<QObject *>,我填写了MyModel的一些实例并且它有效:

QList<QObject *> listElems;
listElems.append(new MyModel());
listElems.append(new MyModel());

QQmlContext *ctxt = view->rootContext();
ctxt->setContextProperty("myModel",QVariant::fromValue(listElems));

但是如果不是使用QList<QObject *>而是使用QList<MyObject *>,那么在加载QML时会出现错误,表明属性名称未定义:

  

qrc:view.qml:10:ReferenceError:未定义名称

我尝试使用qRegisterMetaType<T>()qmlRegisterType<T>()但没有成功。我做错了什么?

1 个答案:

答案 0 :(得分:1)

保持MyModel类和QML方面相同,只需更改以下部分:

#include <qqml.h>

qmlRegisterUncreatableType<MyModel>("MyModel", 1, 0, "MyModel", "Instanciated C++ side !");

QVariantList listElems;
listElems.append(QVariant::fromValue(new MyModel()));
listElems.append(QVariant::fromValue(new MyModel()));
view->rootContext()->setContextProperty("myModel",QVariant::fromValue(listElems));

当然,在QML中“导入MyModel 1.0”。

它应该有效!