繁体   English   中英

使用另一个QML对象作为参数从C ++调用QML函数

[英]call QML function from C++ with another QML object as parameter

我有一个QML文件Dialog.qmlApplicationWindowTab.qmlItem TabViewDialog.qml哪个标签从形成Tab.qml 我想在Qt创建Tab.qml ,将其信号连接到Qt类,然后将该选项卡添加到Dialog 这是代码的相关部分:

//Tab.qml
Item {
    id: tb
    anchors.fill: parent
    //...here is signals and controls like RadioButtons and TextFields
}

//Dialog.qml
ApplicationWindow {
    visible: true
    title: "settings"
    flags: Qt.Dialog
    //...
    function addTabfromCpp(tab){
        frame.addTab("from c++", tab);
    }
    TabView {
        id:frame
        //...
    }
}

我知道当函数参数是原始类型时(通过QVariant ),如何从Qt调用QML函数。 但是,当参数为QQuickWindow或其他参数而无法从中创建QVariant时,如何调用函数呢?

您可以将QML对象ID作为函数参数传递。 在C ++中,这些用作QObject * 另外,除了id外,您还可以使用parent属性或children[indexOfChild] 请注意,您不传递实际的对象,因为这将需要调用复制构造函数,并且所有QObject派生类均禁止复制,它是通过引用传递的,该引用在var和++以及QObject* C ++中都有效。 以类似的方式,您可以使用QObject*将对象传递给QML。 此外,您可能希望使用qRegisterMetaType()Q_DECLARE_METATYPE将自定义类型添加到Qt元类型中,这将为您在QML中自动完成该类型。

为了在QML上下文中公开C ++函数,您需要使这些函数成为QObject派生类的插槽或Q_INVOKABLE ,实例化该类并使用setContextProperty()将其公开给QML。

或者,您可以将该对象注册到QML引擎,以便实例化它,甚至可以按照以下示例在该对象的多个实例之间共享相同的数据

编辑:好的,试试这个:

QML:

ApplicationWindow {
    objectName: "blah"
    //...
    function foo(obj) { console.log(obj) }
}

CPP:

QObject * root = engine.rootObjects().at(0);
QMetaObject::invokeMethod(root, "foo", Q_ARG(QVariant, QVariant::fromValue(root)));

和输出是

qml: ApplicationWindow_QMLTYPE_11_QML_12(0x4121e70, "blah")

似乎您必须将其作为Q_ARG(QVariant, QVariant::fromValue(QObject*)

但是, TabView.addTab()期望的不是对象(是Component的实例),而是组件,即对象的原型。

一种方法是:

QObject * root = engine.rootObjects().at(0);
QQmlComponent comp(&engine, QUrl("qrc:/Test.qml"));
QMetaObject::invokeMethod(root, "addTab", Q_ARG(QVariant, QVariant::fromValue(&comp)));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM