0

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

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 *>我不使用 a而不是使用 a ,QList<MyObject *>那么在加载 QML 时会出现错误,指示未定义属性名称:

qrc:view.qml:10: ReferenceError: name is not defined

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

4

1 回答 1

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 中的“import MyModel 1.0”。

它应该工作!

于 2013-06-20T13:05:26.487 回答