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 elQQmlApplicationEngine
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:
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
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 .