Class 从qml访问同一类实例

Class 从qml访问同一类实例,class,qml,qt5,Class,Qml,Qt5,我正在使用Qt5.1.0和QtQuick 2.0。 我刚刚学会了如何在QML和C++之间交换数据和方法。具体来说,我想公开一个(嵌套的)结构,所以我创建了包含所需属性和方法的类 它是有效的,但是我不能在C++和QML之间共享相同的实例。从C++侧改变某些内容不会导致QML方面的变化。 举个简单的例子: main.cpp #include <QtGui/QGuiApplication> #include <QtQml> #include "qtquick2applicati

我正在使用Qt5.1.0和QtQuick 2.0。 我刚刚学会了如何在QML和C++之间交换数据和方法。具体来说,我想公开一个(嵌套的)结构,所以我创建了包含所需属性和方法的类

它是有效的,但是我不能在C++和QML之间共享相同的实例。从C++侧改变某些内容不会导致QML方面的变化。

举个简单的例子:

main.cpp

#include <QtGui/QGuiApplication>
#include <QtQml>
#include "qtquick2applicationviewer.h"
#include "myclass.h"

int main(int argc, char *argv[]) {
    QGuiApplication app(argc, argv);
    qmlRegisterType<MyClass>("MyLibrary", 1, 0, "MyClass");

    MyClass *myclass = new MyClass();
    Category *cat = new Category();
    cat->setName("foo");
    myclass->append(cat);
    qDebug() << myclass->categoriesCount(); // returns 1 OK!

    QtQuick2ApplicationViewer viewer;
    viewer.setMainQmlFile(QStringLiteral("qml/main.qml"));
    viewer.show();

    return app.exec();
}

恐怕qml引擎会访问主文件中创建的myclass类的另一个实例。

我认为我完全错了。我删除了qmlRegisterType并添加了一个setContextProperty(“myclass”,myclass)。它现在似乎可以工作了。这是有意义的,因为qmlRegisterType允许QML创建该类型的实例,而setContextProperty实际上将对象的实例设置为在QML中可访问。如果您的问题已解决,请将您的答案添加为答案,并将其标记为已接受,以便显示为已回答!
#include <QObject>

class Category : public QObject {
    Q_OBJECT
    Q_PROPERTY(QString name READ name WRITE setName)

public:
    Category() {}
    QString name() const { return m_name; }
    void setName(QString name) { m_name = name; }

private:
    QString m_name;
};

class MyClass : public QObject {
    Q_OBJECT
    Q_PROPERTY(QList<QObject*> categories READ categories NOTIFY categoriesChanged)
    Q_PROPERTY(int categoriesCount READ categoriesCount)

public:
    QList<QObject*> categories() const { return m_categories; }
    void clear() { m_categories.clear(); }
    void append(Category *category) { m_categories.append(category); }
    int categoriesCount() const { return m_categories.count(); }

private:
    QList<QObject*> m_categories;

signals:
    void categoriesChanged();
};
import QtQuick 2.0
import MyLibrary 1.0

Item {
    id: root
    width: 360
    height: 360

    Text {
        id: foo
        text: myclass.categoriesCount // writes 0 -> should be 1
    }

    MyClass {
        id: myclass
    }    
}