QIODevice::read:设备未打开远程JSON文件QT



这让我抓狂。一直在到处寻找解决方案,但令人惊讶的是,将远程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();
});

最新更新