Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


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!

  • Cómo integrar OpenCV en el proyecto Qt Creator Android
  • Qt versiones para arquitecturas mips, brazo, x86 faltan
  • Cómo obtener NFC trabajando en Android con Qt 5.6
  • ¿Hay un #ifdef en Qt para determinar si estamos construyendo para Android
  • Qt Android: ¿Por qué se crea QtApp-debug.apk para una versión de Release?
  • Qt Android: El teclado virtual sigue cambiando a mayúsculas cuando escribo un QLineEdit
  • ¿Cómo especificar bibliotecas sólo para plataforma Android construir en el archivo .pro?
  • Abrir la configuración de Android desde la aplicación QT (com.android.settings)
  • 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.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.