[英]call QML function from C++ with another QML object as parameter
我有一個QML文件Dialog.qml
是ApplicationWindow
和Tab.qml
是Item
。 有TabView
在Dialog.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.