使用cpp代码从加载的qml访问qml对象

时间:2016-04-05 06:42:40

标签: c++ qt qml

我有一个main.qml,使用加载器加载Page1.qml。我怎样才能找到对象' whiteArea'在我的cpp代码的Page1.qml中?

我目前正在使用以下内容来获取对象,并希望获得加载的qml以及此类内容。

QObject * object = engine.rootObjects().at(0)->findChild<QObject *>  ("yourObjectName");

main.qml

import QtQuick 2.3
import QtQuick.Controls 1.2
import myplugin 1.0

ApplicationWindow {
    id:app
    visible: true
    width: 640
    height: 480
    title: qsTr(" World")
    objectName: "Appwindow"
    property ApplicationWindow appwindow:app
    Label {
        objectName: "label"
        text: qsTr(" World")
        anchors.centerIn: parent
    }

    MyItemTest{
        objectName: "myItem"
        anchors.fill: parent
    }

    Rectangle{
        objectName: "Rectangle"
        id:rect
        width: 50
        height: 50
        color: "yellow"
    }

    Button {
        objectName: "MyButton"
        id: btnClick
        text : "btn"
        Loader { id: pageLoader }
        onClicked: {
            pageLoader.source = "Page1.qml"

        }
    }
}

Page1.qml

import QtQuick 2.0
import QtQuick 2.3
import QtQuick.Controls 1.2
import myplugin 1.0

Item {
    Rectangle{
        objectName: "whiteArea"
        id:rect
        width: 50
        height: 50
        color: "white"
    }
}

2 个答案:

答案 0 :(得分:3)

来自Qt documentation

  

可以使用item属性访问加载的对象。

所以你应该在加载的项目中做一些 subsearch ,例如:

QObject * loader = engine.rootObjects().at(0)->findChild<QObject*>("loader");
qWarning() << loader;
QObject * item = qvariant_cast<QObject*>(QQmlProperty::read(loader,"item"));
qWarning() << item;
QObject *whiteArea = item->findChild<QObject *>("whiteArea");
qWarning() << whiteArea;

输出:

QQuickLoader(0x24918240, name = "loader")
QQuickItem(0x24919740)
QQuickRectangle(0x24919728, name = "whiteArea")

答案 1 :(得分:0)

首先,给Loader一个对象名称属性,例如“ loader”。 然后确保在运行以下代码时, loader.item设置为“ Page1.qml” ,然后执行以下操作:

QObject* loader = m_engine->rootObjects()[0]->findChild<QObject*>("loader");
QObject* page= qvariant_cast<QObject *>(loader->property("item"));
QObject* whiteArea = page->findChild<QObject*>("whiteArea");