Я новичок в QT и мне нужна помощь. Если бы кто-нибудь из вас мог мне помочь, я был бы очень признателен.
ВОПРОС:
У меня есть асинхронный класс, который выполняет HTTP-запрос и будет получать некоторые данные в формат JSON, и оттуда я извлечу необходимую информацию, которая должна быть передана моему пользовательскому виджету. Как я могу это сделать? Потому что я не знаю, когда будет получена информация.
ЧТО Я ДЕЙСТВИТЕЛЬНО СДЕЛАЛ:
Мой HTTP-запрос и его анализ JSON класс:
WeatherAPI::WeatherAPI(QObject *parent) : QObject(parent) {
manager = new QNetworkAccessManager(this);
QObject::connect(manager, SIGNAL(finished(QNetworkReply * )), this, SLOT(readData(QNetworkReply * )));
}
void WeatherAPI::readData(QNetworkReply *reply) {
if (reply->error() == QNetworkReply::NoError) {
QString strReply = (QString) reply->readAll();
QJsonDocument jsonResponse = QJsonDocument::fromJson(strReply.toUtf8());
QJsonObject jsonObject = jsonResponse.object();
weatherObject.city = jsonObject["name"].toString();
weatherObject.temperature = QString::number(jsonObject["main"].toObject()["temp"].toDouble() - 273.15);
int ts = jsonObject["dt"].toInt();
weatherObject.time = QDateTime::fromSecsSinceEpoch(ts).toString("hh:mm");
auto weatherData = jsonObject["weather"].toArray()[0].toObject()["main"].toString();
if (weatherData == "Clouds") {
weatherObject.icon = "Sun.png";
}
} else {
qDebug() << "ERROR";
}
}
void WeatherAPI::requestDataForCity(const QString &city) {
QString link = linkTemplate.arg(city, key);
QUrl url(link);
manager->get(QNetworkRequest(url));
}
const WeatherObject &WeatherAPI::getWeatherObject() const {
return weatherObject;
}
Вот мой пользовательский виджет:
void WeatherButton::initStyle(const QJsonValue &json) {
PolygonButtonWidget::initStyle(json);
auto cities = json.toObject()["cities"].toArray();
api = new WeatherAPI(this);
for (auto c: cities) {
QString city = c.toString();
api->requestDataForCity(city); // HERE I'm making the http request
WeatherObject data = api->getWeatherObject();//HERE I'm getting the DATA
m_title = data.city;
m_time = data.time;
m_icon = data.icon;
m_temperature = data.temperature;
}
}
В этой функции из WeatherButton :: initStyle Я собираюсь сделать HTTP-запрос, а также m собираюсь поместить данные в нужную переменную. Теперь мой вопрос ... Как я могу дождаться получения этих данных и сразу после этого поместить их в эти переменные?
Пока что единственное известное мне решение - использовать QEventL oop, но в этот момент я собираюсь в основном преобразовать вызов asyn c в вызов syn c, что не совсем то, что я хочу. Я хочу быть полностью асинхронным c.