【问题标题】:Accessing qml objects from loaded qml using cpp code使用 cpp 代码从加载的 qml 访问 qml 对象
【发布时间】:2016-04-05 06:42:39
【问题描述】:

我有一个 main.qml,它使用加载器加载 Page1.qml。如何从我的 cpp 代码中找到 Page1.qml 中的对象“whiteArea”?

我目前正在使用以下方法来获取一个对象,并且也想像这样获取加载的 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"
    }
}

【问题讨论】:

    标签: c++ qt qml


    【解决方案1】:

    来自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")
    

    【讨论】:

      【解决方案2】:

      首先,给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");
      

      【讨论】:

        猜你喜欢
        • 2018-05-17
        • 2019-04-13
        • 1970-01-01
        • 2021-03-22
        • 1970-01-01
        • 1970-01-01
        • 2014-01-15
        • 1970-01-01
        • 2020-08-01
        相关资源
        最近更新 更多