我正在尝试进行简单的编程,将JSON消息值从web解析到Qt Quick。
JSON 消息想要解析:
[
{
"id": 2,
"name": "yahoo",
"link": "http://www.yahoo.com/",
"created_by": "superadmin",
"create_time": "2015-03-12 14:45:21"
},
{
"id": 3,
"name": "Google",
"link": "http://www.google.com/",
"created_by": "superadmin",
"create_time": "2015-03-12 14:45:41"
},
{
"id": 4,
"name": "PS",
"link": "http://www.playstation.com",
"created_by": "superadmin",
"create_time": "2015-03-24 11:57:21"
}
]
以下是 Qt 代码 main.cpp 尝试解析这些数据:
#include <QGuiApplication>
#include <QStringList>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QNetworkAccessManager>
#include <QtScript/QScriptEngine>
#include <QtScript/QScriptValueIterator>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <qqmlengine.h>
#include <qqmlcontext.h>
#include <qqml.h>
#include <QtQuick/qquickitem.h>
#include <QtQuick/qquickview.h>
#include <main.h>
QStringList Jsondata::datalistmethod() {
return datalist;
}
void Jsondata::onResult(QNetworkReply* reply)
{
QString data = (QString) reply->readAll();
QJsonDocument jsonResponse = QJsonDocument::fromJson(data.toUtf8());
QJsonObject jsonObject = jsonResponse.object();
foreach (const QJsonValue & value, jsonObject) {
QJsonObject obj = value.toObject();
datalist.append(obj["name"].toString());
datalist.append(obj["link"].toString());
}
}
int main(int argc, char ** argv)
{
QGuiApplication app(argc, argv);
Jsondata jsondata;
// Now parse this JSON according to your needs !
QNetworkAccessManager networkManager;
networkManager.setNetworkAccessible(QNetworkAccessManager::Accessible);
QUrl url("http://dbs.wasonicsystem.com/gta_test/api/web/v1/links");
QNetworkRequest request;
request.setUrl(url);
Jsondata::connect(&networkManager, SIGNAL(finished(QNetworkReply*)), &jsondata, SLOT(onResult(QNetworkReply*)));
networkManager.get(request); // GET
QStringList datalist;
datalist = jsondata.datalistmethod();
QQuickView view;
QQmlContext *ctxt = view.rootContext();
ctxt->setContextProperty("myModel", QVariant::fromValue(datalist));
view.setSource(QUrl("qrc:main.qml"));
view.show();
return app.exec();
}
主H
#ifndef MAIN
#define MAIN
#include <QObject>
#include <QNetworkReply>
#include <QStringList>
class Jsondata : public QObject {
Q_OBJECT
QStringList datalist;
public slots:
void onResult (QNetworkReply*);
public:
QStringList datalistmethod();
};
#endif // MAIN
主.qml
import QtQuick 2.0
//![0]
ListView {
width: 100; height: 100
model: myModel
delegate: Rectangle {
height: 25
width: 100
Text { text: modelData }
}
}
//![0]
结果:on结果仍未调用。所以没有返回数据列表
我对这个QObject::connect
一无所知,也不知道出了什么问题。如果您能帮助我修复此错误,我将不胜感激。
我终于找到了解决问题的方法。以下是代码片段。
主.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());
}
}
通过添加事件循环,datalist 方法将等待 onResult 方法完成以执行下一行代码。这是使用字符串列表模型的示例。如果有人觉得它对参考有用,请+1我的帖子。 谢谢。^^