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:
- ¿Cuál es mejor android o qt?
- ¿Qué es carotene_o4t y por qué causa problemas con la compilación de un programa utilizando opencv con Qt en Android?
- Depuración de la aplicación android en el destino en QtCreator
- Comparación entre QAbstractButton y QPushButton * carece de un molde
- No se puede emitir señal en Android
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 especificar bibliotecas sólo para plataforma Android construir en el archivo .pro?
- Cómo integrar OpenCV en el proyecto Qt Creator Android
- Cómo utilizar la clase Qt Jni "QAndroidJniObject"
- Android Emulator no funciona en Ubuntu después de actualizar Android Studio a 2.0 - Biblioteca Qt no encontrada
- Qt Android: Al presionar "Hecho" no oculta el teclado
- QSettings no funciona correctamente en Qt bajo Android
- QML El enfoque de la cámara no funciona
- Aplicaciones multipágina en QML
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.
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.
- La ejecución falló para la tarea ': app: shrinkReleaseMultiDexComponents'
- Lista de visualización de Android usando expandibleListView