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.

  • Cómo agregar archivos de expansión de Android con Qt
  • Versión Qt / QML del kernel
  • Android - enviar comandos HDMI CEC a TV - minix - libCEC
  • Tipo de plataforma Qt Check: Móvil o Escritorio
  • Qt Android: ¿Cómo mostrar el diálogo de archivo nativo?
  • ¿Cómo mantener la pantalla encendida en Qt para Android?
  • Cómo importar bibliotecas compartidas en Cmake para Android
  • Cómo lento o rápido es Qt móvil para Android
  • QScroller El desplazamiento cinético no es suave
  • QML El enfoque de la cámara no funciona
  • Depuración de la aplicación android en el destino en QtCreator
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.