Q_RETURN_ARG y QQmlComponent – componente no listo

He pasado 3 días comprobando cuidadosamente el mejor material de referencia que pude encontrar en Internet acerca de Q_RETURN_ARG. Ya he incluido QQmlComponent . Cuando se utiliza en C ++ para enviar una variable para mostrar en QML, las cosas no siempre son como parece. Tal vez porque Qt5 es relativamente nuevo, no hay mucho material juntos que podemos confiar en todavía.

Básicamente, el código se compila sin problema. Cuando le pido que ejecute, que hace que la página qml para el dispositivo sin ningún problema, y ​​luego obtiene el error:

QQmlComponent: Component is not ready main.cpp:33 (int main(int, char**)): Got QML return: "" 

Además de los archivos invoke.pro y myapplication.cpp, aquí están las partes clave del pequeño ejemplo que estoy tratando de resolver, basado en esta publicación , la documentación de Qt5 , el tutorial de ICS , la publicación y el enlace :

./myapplication.h

 #include <QObject> #include <QDebug> #include <QQmlComponent> class MyApplication : public QObject { Q_OBJECT public: explicit MyApplication(QObject *parent = 0); ~MyApplication(void) {} QObject *object; QQmlComponent *component; void loadComponent(void) { QQmlEngine engine; QQmlComponent *component = new QQmlComponent(&engine); component->loadUrl(QStringLiteral("qml/invoke/main.qml")); if(!component->isReady()){ qWarning("qPrintable: %s", qPrintable(component->errorString())); } if (component->isLoading()){ cout <<"==== component->isLoading ===="; QObject::connect(component, SIGNAL(statusChanged()), this, SLOT(continueLoading())); } else{ cout <<"==== component is not Loading ===="; continueLoading(); } } signals: public slots: void continueLoading() { QQmlEngine engine; QQmlComponent *component = new QQmlComponent(&engine); component->loadUrl(QStringLiteral("qml/invoke/main.qml")); if (component->isError()) { qWarning() << "component->isError()="<< component->errors(); } else { object = component->create(); cout <<"object created"; } } }; 

./main.qml

 import QtQuick 2.0 Rectangle { width: 360 height: 360 Item { function myQmlFunction(msg_cpp) { console.log("Got msg_cpp:", msg_cpp) return "output" } } } 

./main.cpp

 #include <QtGui/QGuiApplication> #include "qtquick2applicationviewer.h" #include <QtQuick/QQuickItem> #include <QtQuick/QQuickView> #include <QQmlEngine> #include <QtQml> #include <QDeclarativeEngine> #include <QtCore> #include <QtQuick/QtQuick> #include <QQmlComponent> #include <QtQml/qqml.h> #include "myapplication.h" int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QtQuick2ApplicationViewer viewer; viewer.setMainQmlFile(QStringLiteral("qml/invoke/main.qml")); MyApplication *myClass = new MyApplication(); myClass->loadComponent(); QObject *object=myClass->object; QVariant returnedValue; QVariant msg_cpp = "C++ message"; QMetaObject::invokeMethod(object, "myQmlFunction", Q_RETURN_ARG(QVariant, returnedValue), Q_ARG(QVariant, msg_cpp)); qDebug() << "Got QML return:" << returnedValue.toString(); viewer.showExpanded(); delete object; return app.exec(); } 

Que da el error:

 loadComponent()): qPrintable: file://qml/invoke/main.qml:-1 File not found continueLoading()): component->isError()= (file://qml/invoke/main.qml: File not found) main.cpp:36 (int main(int, char**)): Got QML return: "" 

Me di cuenta de que main.qml está destinado a cargar en Android utilizando "QtQuick2ApplicationViewer" en lugar de "QQmlEngine". En caso de que el "QQmlEngine" no se utilice en absoluto para cargar main.qml en el intento de ejecutar Q_RETURN_ARG – cuando se trata de Android, y por lo tanto es por eso que "componente QQmlComponent" no está cargando? Si intento usar "QtQuick2ApplicationViewer viewer" reemplazando "QQmlEngine engine" por "QQmlComponent component", dice: "no matchning function for call to QQmlComponent".

¿Alguna sugerencia de cómo inicializar QQmlComponent, así que Q_RETURN_ARG empieza a funcionar? ¡Gracias!

Recibí una revisión rápida de su código y lo hice funcionar con algunos cambios, pero tiene algunos grandes (BIG!) QT / conceptos de codificación que faltan.

Algunos de los errores clave para que funcione:

  • El error de archivo es sólo una cuestión de establecer correctamente la ruta del archivo.
  • La fuente de carga necesita tiempo, no una secuencia ansiosa de no estar lista -> cargar de nuevo con otro QQmlEngine. (Esto no es fijo en mi código)
  • MyQmlFunction necesita obtener superior en el árbol QML, o algún otro tipo de ayuda de referencia.

Aquí puede echar un vistazo al código completo.

http://pastebin.com/PRLBtKWU

Le recomendaría que eche un vistazo a este libro http://qmlbook.org/ y que practique con ejemplos QT para su versión actual de QT.

  • QScroller El desplazamiento cinético no es suave
  • ¿Cómo mantener la pantalla encendida en Qt para Android?
  • Implementación de aplicaciones Android Qt 5.1
  • Configurar una aplicación Qt5 5.7 para Android con CMake
  • Qt 5.2 y Android Error
  • Portar la aplicación iphone. Si tuviera que iniciar su aplicación de nuevo desde cero, ¿qué haría de manera diferente?
  • Cámara Qt QML a C ++ QImage en Android
  • ¿Cómo hacer que QVideoProbe funcione?
  • Cómo configurar el uso de la cámara en Android con OpenCV + Qt5
  • Llamar a la actividad externa mediante una intención (explícita) de la aplicación Qt en Android - putExtra no funciona
  • ¿Qué aplicaciones de Google Play se crean utilizando Qt?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.