簡體   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