Incrustación de objetos C++ en QML con propiedades de contexto
Advertencia: Al utilizar propiedades de contexto en su código QML, crea una dependencia de su código QML con el contexto específico que tiene en mente al escribirlo. Esto limita la reutilización de su código, ya que el contexto puede ser diferente en otros lugares donde pueda utilizarse. Además, la dependencia no se declara. Nunca import el contexto o de otra manera indicar lo que usted espera. Por lo tanto, cualquiera que intente reutilizar tu código tendrá dificultades para averiguar si el lugar de reutilización tiene un contexto suficiente para tu código.
Advertencia: Las propiedades de contexto son invisibles para cualquier herramienta que procese código QML por adelantado, antes de cargarlo en el motor QML. El compiladorQt Quick , qmllint y la herramienta QML Language Server no saben nada de sus propiedades de contexto y considerarán cualquier acceso a las propiedades de contexto como un acceso no cualificado.
Nota: Por lo general, las propiedades de contexto pueden sustituirse por propiedades normales en el objeto raíz de un componente o por singletons definidos en C++ mediante QML_SINGLETON o en QML mediante pragma Singleton.
Al cargar un objeto QML en una aplicación C++, puede resultar útil incrustar directamente algunos datos C++ que pueden utilizarse desde el código QML. Esto permite, por ejemplo, invocar un método C++ en el objeto incrustado, o utilizar una instancia de objeto C++ como modelo de datos para una vista QML.
La posibilidad de inyectar datos C++ en un objeto QML es posible gracias a la clase QQmlContext. Esta clase expone datos al contexto de un objeto QML para que se pueda hacer referencia a los datos directamente desde el ámbito del código QML.
Configuración de una propiedad de contexto simple
Por ejemplo, a continuación se muestra un elemento QML que hace referencia a un valor currentDateTime que no existe en el ámbito actual:
// MyItem.qml import QtQuick Text { text: currentDateTime }
Este valor currentDateTime puede ser establecido directamente por la aplicación C++ que carga el componente QML, utilizando QQmlContext::setContextProperty():
QQuickView view; view.rootContext()->setContextProperty("currentDateTime", QDateTime::currentDateTime()); view.setSource(QUrl::fromLocalFile("MyItem.qml")); view.show();
Nota: Dado que todas las expresiones evaluadas en QML se evalúan en un contexto determinado, si se modifica el contexto, se volverán a evaluar todas las vinculaciones de ese contexto. Por lo tanto, las propiedades de contexto deben utilizarse con cuidado fuera de la inicialización de la aplicación, ya que esto puede provocar una disminución del rendimiento de la aplicación.
Establecer un objeto como propiedad de contexto
Las propiedades de contexto pueden contener valores QVariant o QObject*. Esto significa que también se pueden inyectar objetos C++ personalizados utilizando este método, y que estos objetos se pueden modificar y leer directamente en QML. A continuación, modificamos el ejemplo anterior para incrustar una instancia de QObject en lugar de un valor de QDateTime, y el código QML invoca un método en la instancia del objeto:
| C++ | class ApplicationData : public QObject { Q_OBJECT public: Q_INVOKABLE QDateTime getCurrentDateTime() const { return QDateTime::currentDateTime(); } }; int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQuickView view; ApplicationData data; view.rootContext()->setContextProperty("applicationData", &data); view.setSource(QUrl::fromLocalFile("MyItem.qml")); view.show(); return app.exec(); } |
| QML | // MyItem.qml import QtQuick Text { text: applicationData.getCurrentDateTime() } |
(Tenga en cuenta que los valores de fecha/hora devueltos desde C++ a QML pueden formatearse mediante Qt.formatDateTime() y las funciones asociadas).
Si el elemento QML necesita recibir señales de la propiedad de contexto, puede conectarse a ellas utilizando el tipo Connections. Por ejemplo, si ApplicationData tiene una señal denominada dataChanged(), se puede conectar a esta señal utilizando un manejador onDataChanged dentro de un objeto Connections:
Text { text: applicationData.getCurrentDateTime() Connections { target: applicationData onDataChanged: console.log("The application data changed!") } }
Las propiedades de contexto pueden ser útiles para utilizar modelos de datos basados en C++ en una vista QML. Véanse los siguientes ejemplos:
que demuestran el uso de modelos basados en QStringList, QList<QObject*> y QAbstractItemModel en vistas QML.
Consulte también la documentación de QQmlContext para obtener más información.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.