这让我抓狂。一直在到处寻找解决方案,但令人惊讶的是,将远程JSON文件加载到QT中的方法很少。
我有这样的代码,当我尝试加载本地文件时,它可以很好地工作。
QFile jsonFile("/Users/blah/blah/myfile.json");
if (!jsonFile.open(QIODevice::ReadOnly | QIODevice::Text))
{
qDebug() << "Unable to open file, exiting...";
return;
}
QByteArray jsonData = jsonFile.readAll();
QJsonDocument doc = QJsonDocument::fromJson(jsonData);
QJsonObject jObject = doc.object();
QVariantMap json_map = jObject.toVariantMap();
QString getNow = json_map["now"].toString();
QString getImage = json_map["image"].toString();
QString getNext = json_map["next"].toString();
ui->live1->setText(getNow);
ui->live2->setText(getImage);
ui->live3->setText(getNext);
但在过去的5个小时里,我所尝试的一切都无法加载远程文件,我找不到一个直接的解释来说明如何实现这么简单的事情。
QFile jsonFile("https://myserver.com/myfile.json");
QUrl jsonFile("https://myserver.com/myfile.json");
还有一大堆其他方法,包括QTextStream和我认为可能会这样做的任何其他方法,这似乎超出了我想要做的范围。但一切要么都会返回。。。
QIODevice::read: device not open
或者一系列其他错误让我知道我搞砸了。
有人能帮我摆脱痛苦吗?
**编辑**
使用QNetwork库,但现在在QObject::connect
行上抛出expected expression
错误?
QNetworkAccessManager manager;
QNetworkRequest request(QUrl("https://myserver.com/myfile.json"));
QNetworkReply *reply = manager.get(request);
QObject::connect(reply, &QNetworkReply::finished, [&]() {
QByteArray data = reply->readAll();
QJsonDocument doc = QJsonDocument::fromJson(data);
QJsonObject jObject = doc.object();
QVariantMap json_map = jObject.toVariantMap();
QString getNow = json_map["now"].toString();
QString getImage = json_map["image"].toString();
QString getNext = json_map["next"].toString();
ui->live1->setText(getNow);
ui->live2->setText(getImage);
ui->live3->setText(getNext);
reply->deleteLater();
});
**编辑2*
我刚刚意识到我需要包含C++11编译器
CONFIG += c++11
但现在它只是精神上抛出SSL错误
qt.network.ssl: QSslSocket: cannot resolve TLSv1_1_client_method
qt.network.ssl: QSslSocket: cannot resolve TLSv1_2_client_method
qt.network.ssl: QSslSocket: cannot resolve TLSv1_1_server_method
qt.network.ssl: QSslSocket: cannot resolve TLSv1_2_server_method
qt.network.ssl: QSslSocket: cannot resolve SSL_select_next_proto
qt.network.ssl: QSslSocket: cannot resolve SSL_CTX_set_next_proto_select_cb
qt.network.ssl: QSslSocket: cannot resolve SSL_get0_next_proto_negotiated
**编辑3**
正在取得一些进展(我想…)
QT似乎使用的是旧版本的SSL(根据文档可能不支持)。
当被问及SSL时,QDebug吐出了这个。。。
Support SSL: true
Lib Version Number: 9470431
Lib Version String: "OpenSSL 0.9.8zh 14 Jan 2016"
Lib Build Version Number: 268439727
Lib Build Version String: "OpenSSL 1.0.1j 15 Oct 2014"
所以现在我需要弄清楚如何让QT使用我机器上的新版本。
QFile
不支持远程URI。为此,您需要使用QtNetwork。
下面的C++11示例演示了如何从远程URI:中检索JSON
QNetworkAccessManager manager;
QNetworkRequest request(QUrl("http://example.com/file.json"));
QNetworkReply *reply = manager.get(request);
QObject::connect(reply, &QNetworkReply::finished, [&]() {
QByteArray data = reply->readAll();
// do stuff with data
reply->deleteLater();
});