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!

One Solution collect form web for “Q_RETURN_ARG y QQmlComponent – componente no listo”

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.

  • Biblioteca multiplataforma para comunicaciones entre C ++ y código nativo de plataforma (iOS, Android)
  • Qt - Compilation for Linux no es compilación para Android? ¿Por qué?
  • Android NDK: ¿Por qué desapareció arm-linux-androideabi-gdb.exe?
  • Actividad de Android / Intención vs. Qt Signal / Slot vs. iPhone? /?
  • Empuje usando Parse en Qt5.5 para Android: NullPointerException en getCurrentInstallation
  • Animar nuevos elementos en un TableView
  • Qt en android, reduciendo el tamaño binario
  • QNetwork error cuando se utiliza Qt lib con la aplicación JNI Android nativa
  • Llamar a la actividad externa mediante una intención (explícita) de la aplicación Qt en Android - putExtra no funciona
  • CMake para Android con Qt Creator - Bug
  • Qt cómo conectar a un archivo SQLlite existente en el sistema operativo Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.