how creator app c++ qt user-interface qml qtquick2

creator - ¿Cómo puedo acceder a las propiedades de mi objeto Window desde C++ mientras uso QQmlApplicationEngine?



qt creator qml (1)

He estado tratando de aprender QtQuick para la creación de la GUI, pero he estado teniendo dificultades para entender cómo interactuar con los objetos QML de la parte C ++ de mi programa de prueba.

Aquí está mi archivo QML simple:

import QtQuick 2.2 import QtQuick.Window 2.1 Window { id: mainWindow visible: true width: 800 height: 800 color: "#FFFF0000" MouseArea { anchors.fill: parent onClicked: Qt.quit() } Rectangle { id: testRect width: 100 height: 100 anchors.centerIn: parent color: "#FF0000FF" } }

Aquí está el archivo básico de C ++ que viene con él (autogenerado por QtCreator):

#include <QGuiApplication> #include <QQmlApplicationEngine> int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; engine.load(QUrl(QStringLiteral("qrc:///main.qml"))); return app.exec(); }

Mi problema es que no tengo idea de cómo obtener acceso a mi objeto QML ''Ventana'' y, como resultado, ¡no puedo alterar ninguna de sus propiedades o las propiedades de sus hijos! Esta parte de la documentación de QtQuick muestra dos métodos para acceder a los objetos QML desde el código C ++, pero ninguno de ellos parece aplicarse a este esquema de carga ''QQmlApplicationEngine''. También he visto a personas usar cosas como ''QApplicationViewer'' y ''QDeclaritiveView'' , pero parece que no puedo encontrarlos en la documentación oficial en absoluto ...

Me estoy realmente frustrando con QtQuick; la ''simplicidad'' de QML parece haberse perdido en un mar de documentación contradictoria y una interfaz intrincada entre C ++ y QML. ¿Hay alguna forma de que acceda a mis objetos QML mientras uso el método QQmlApplicationEngine? He intentado usar ''QuickView'', pero parece que no funciona bien con los objetos Window QML ..? ¿QQmlApplicationEngine solo es útil para aplicaciones QML en un solo archivo? Hasta el momento, cada pieza de documentación y tutorial que he leído ha mostrado algo diferente.

Cualquier ayuda o aclaración sería apreciada. Idealmente, me gustaría saber cómo acceder y modificar los objetos QML (como ''mainWindow'', ''testRect'' y otros objetos en otros archivos) a través de mi código C ++.


Convirtiendo mi comentario en una respuesta adecuada: esto generalmente se hace por dos métodos:

  • Obtenga el objeto raíz de su escena QML a través de una vista si usa QQuickView o solo el QQmlApplicationEngine directamente.

  • Este próximo paso se puede omitir para los objetos raíz, pero para los "objetos qml" en general, necesitará tener la propiedad objectName establecida y luego puede encontrar cualquier elemento secundario con el siguiente método:

QList QObject :: findChildren (const QString & name = QString (), Qt :: FindChildOptions options = Qt :: FindChildrenRecursively) const

Lado C ++

#include <QGuiApplication> #include <QQmlApplicationEngine> #include <QDebug> int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; engine.load(QUrl(QStringLiteral("qrc:///main.qml"))); // Step 1: get access to the root object QObject *rootObject = engine.rootObjects().first(); QObject *qmlObject = rootObject->findChild<QObject*>("mainWindow"); // Step 2a: set or get the desired property value for the root object rootObject->setProperty("visible", true); qDebug() << rootObject->property("visible"); // Step 2b: set or get the desired property value for any qml object qmlObject->setProperty("visible", true); qDebug() << qmlObject->property("visible"); return app.exec(); }

Consulte la documentación del conjunto de propiedades y obtenga la documentación oficial:

bool QObject :: setProperty (const char * nombre, const QVariant y valor)

y

QVariant QObject :: property (const char * name) const

Bueno, ahora estamos más o menos hechos en el lado de C ++.

QML Side

También deberá tener la propiedad objectName de sus objetos qml establecidos si desea acceder a algo más que el elemento raíz de la siguiente manera:

import QtQuick 2.2 import QtQuick.Window 2.1 Window { id: mainWindow objectName: "mainWindow" ... }

Esto se puede hacer de manera similar para cualquier objeto QML. La clave es "objectName" aquí. Podría omitir eso para el objeto raíz ya que el lado C ++ obtiene el objeto raíz directamente, pero dado que se está refiriendo a objetos QML en su pregunta, supongo que le gustaría resolverlo en general. Una vez que desee hacer lo mismo para cualquier objeto QML, es decir, incluidos los niños, deberá usar la propiedad objectName .