从C++访问现有的 QML 组件

Access to existing QML component from C++

本文关键字:QML 组件 C++ 访问      更新时间:2023-10-16

我是QML的新手,无法解决一个简单的问题。我想从C++访问 QML 组件,但我不能。指针test始终为 0。可能是什么原因?

代码如下:

主.cpp

int main(int argc, char *argv[])
{
    QGuiApplication &app=reg6::Bonder::BonderGuiApplication::instance();
    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    QObject* test=engine.rootObjects().first()->findChild<QObject*> ("cameraArea");
    test->setProperty("color","black");
    return app.exec();
}

主.qml

import QtQuick 2.5
import QtQuick.Controls 1.4
import QtQuick.Dialogs 1.2
import QtQuick.Layouts 1.0
ApplicationWindow {
visible: true
width: 1800
height: 900
SplitView
{
    anchors.fill: parent
    orientation: Qt.Vertical
    SplitView {
        Layout.fillHeight: true
        SplitView {
            orientation: Qt.Vertical
            width:400
            Layout.minimumWidth: 400
            Layout.maximumWidth: 500
            Camera {
                id: cameraArea
                height: 400
                Layout.maximumHeight: 400
                Layout.minimumHeight: 300
            }
            List {
                id: listArea
            }
        }
        Bonder {
            id: mainArea
            Layout.fillWidth: true
        }
        Properties {
            id: propertiesArea
            Layout.minimumWidth: 300
            Layout.maximumWidth: 400
        }
    }
    Error {
        id: errorArea
        Layout.minimumHeight: 100
        height: 200
    }
}
}

相机.qml

import QtQuick 2.5
Rectangle {
    color: "lightblue"
}

您还必须设置 QML 组件objectName 属性才能获得指向QObject的有效指针,因为T QObject::findChild(const QString &name = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const需要objectName而不是 ID