QML和C ++:如何将导出的C ++对象的引用传递给导出的C ++类?

时间:2013-12-03 18:12:04

标签: c++ qt qml

我导出了C++类和对象,如下所示:

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

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

    //object export
    ClassA classA(QString stuff);
    QQmlContext* context = viewer.engine()->rootContext();
    context->setContextProperty("_classA", &classA);

    //class export
    qmlRegisterType<ClassB>("CustomComponents", 1, 0, "ClassB");


    return app.exec();
}

我将在其中嵌入QML创建任意数量的ClassB个对象。我希望每个ClassB都有一个引用或指向此程序中存在的1 ClassA的引用。当我在QML个对象中初始化ClassA时,我ClassB如何获取QML的引用,以便ClassB可以使用ClassA }}?

1 个答案:

答案 0 :(得分:1)

您必须更改操作的顺序:

  1. 注册B
  2. 在根上下文
  3. 上设置实例
  4. 加载源,在那里实例化(根据需要多次):

    B { aPtr: _classA }

  5. 理由是:

    • 要使smth出现在QML源中并用于实例化类,必须先注册这些类(C ++ QML插件也可以这样做)
    • 如果项目依赖于上下文属性的存在,则应仅在设置了上下文属性后才创建它们

    鉴于此,上面的步骤(1)和(2)实际上可以交换。

    我相信有很多方法可以用C ++手工创建,父级和连接所有内容,但这可能是极端黑暗艺术的一个例子(想想从JS表达式手动创建绑定,创建上下文,然后将项目实例化到其中。 ..);从来没有在野外见过:)