Q_RETURN_ARG и QQmlComponent – компонент не готов

Я провел 3 дня, тщательно проверяя лучший справочный материал, который я мог найти в Интернете о Q_RETURN_ARG. Я уже включил QQmlComponent . При использовании на C ++ для отправки переменной, отображаемой на QML, все происходит не всегда так, как кажется. Может быть, потому, что Qt5 относительно новый, не так много материала, на который мы можем положиться.

В принципе, код компилируется без проблем. Когда я попрошу его запустить, он без проблем отображает qml-страницу, а затем получает ошибку:

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

Помимо файлов invoke.pro и myapplication.cpp, вот ключевые части небольшого примера, который я пытаюсь выработать, на основе этой публикации , документации Qt5 , учебника , публикации и ссылки ICS :

./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(); } 

Что дает ошибку:

 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: "" 

Я заметил, что main.qml предназначен для загрузки на Android с помощью «QtQuick2ApplicationViewer» вместо «QQmlEngine». Если «QQmlEngine» вообще не используется для загрузки main.qml в попытке запустить Q_RETURN_ARG – при работе с Android, и поэтому поэтому «компонент QQmlComponent» не загружается? Если я попытаюсь использовать «QtQuick2ApplicationViewer viewer», заменив «QQmlEngine engine» на «компонент QQmlComponent», он говорит: «нет функции matchning для вызова QQmlComponent».

Любые предложения по инициализации QQmlComponent, поэтому Q_RETURN_ARG начинает работать? Благодаря!

Я получил быстрый обзор вашего кода и получил его работу с несколькими изменениями, но у него есть некоторые большие (БОЛЬШИЕ!) Концепции QT / кодирования.

Некоторые из ключевых ошибок, чтобы заставить его работать:

  • Ошибка файла – это просто вопрос правильной установки пути к файлу.
  • Для источника загрузки требуется время, а не желаемая последовательность не готовых -> загрузка снова с другим QQmlEngine. (Это не исправлено в моем коде)
  • MyQmlFunction должен получить верхнюю часть в дереве QML или какую-либо другую справочную помощь.

Здесь вы можете посмотреть полный код.

http://pastebin.com/PRLBtKWU

Я бы порекомендовал вам взглянуть на эту книгу http://qmlbook.org/ и практиковать примеры QT для вашей текущей версии QT.