I finally found a method to solve the problem. The following is the code snippet.
main.cpp
#include <QGuiApplication>
#include <QStringList>
#include <qqmlengine.h>
#include <qqmlcontext.h>
#include <qqml.h>
#include <QtQuick/qquickitem.h>
#include <QtQuick/qquickview.h>
#include <jsondata.h>
int main(int argc, char ** argv)
{
QGuiApplication app(argc, argv);
QStringList datalist;
Jsondata jsondata;
jsondata.datalistmethod();
datalist = jsondata.datalist;
QQuickView view;
QQmlContext *ctxt = view.rootContext();
ctxt->setContextProperty("myModel", QVariant::fromValue(datalist));
view.setSource(QUrl("qrc:main.qml"));
view.show();
return app.exec();
}
jsondata.h
#ifndef JSONDATA_H
#define JSONDATA_H
#include <QObject>
#include <QNetworkReply>
#include <QStringList>
#include <QNetworkAccessManager>
class Jsondata : public QObject {
Q_OBJECT
public:
QStringList datalist;
explicit Jsondata(QObject *parent =0);
void datalistmethod();
public slots:
void onResult (QNetworkReply*);
private:
QNetworkAccessManager *manager;
};
jsondata.cpp
#include "jsondata.h"
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QNetworkAccessManager>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QEventLoop>
#include <QtQuick/qquickitem.h>
#include <QtQuick/qquickview.h>
#include <QTimer>
#include <qqmlengine.h>
#include <qqmlcontext.h>
#include <qqml.h>
Jsondata::Jsondata(QObject *parent) :
QObject(parent)
{
}
void Jsondata::datalistmethod() {
// Now parse this JSON according to your needs !
manager = new QNetworkAccessManager(this);
manager->setNetworkAccessible(QNetworkAccessManager::Accessible);
QNetworkRequest request;
QEventLoop eventloop;
QUrl url("http://***/api/web/v1/links");
request.setUrl(url);
QNetworkReply *reply = manager->get(request);
connect(reply, SIGNAL(finished()), &eventloop, SLOT(quit()));
eventloop.exec();
onResult(reply);
}
void Jsondata::onResult(QNetworkReply* reply)
{
QString data = (QString) reply->readAll();
qDebug() << "Response:" << data;
QJsonDocument jsonResponse = QJsonDocument::fromJson(data.toUtf8());
QJsonArray jsonArray = jsonResponse.array();
foreach (const QJsonValue & value, jsonArray) {
QJsonObject obj = value.toObject();
datalist.append(obj["name"].toString());
datalist.append(obj["link"].toString());
}
}
By adding event loop, the datalist method will wait for the onResult method completed to execute next line of code. This is using the example of string list model. If anyone feel it useful for reference, please +1 my post. Thank you. ^^