void AppModel::handleGeoNetworkData(QObject *replyObj) { QNetworkReply *networkReply = qobject_cast<QNetworkReply*>(replyObj); if (!networkReply) { hadError(false); // should retry? return; } if (!networkReply->error()) { d->nErrors = 0; if (!d->throttle.isValid()) d->throttle.start(); d->minMsBeforeNewRequest = d->baseMsBeforeNewRequest; //convert coordinates to city name QJsonDocument document = QJsonDocument::fromJson(networkReply->readAll()); QJsonObject jo = document.object(); QJsonValue jv = jo.value(QStringLiteral("name")); const QString city = jv.toString(); qCDebug(requestsLog) << "got city: " << city; if (city != d->city) { d->city = city; emit cityChanged(); refreshWeather(); } } else { hadError(true); } networkReply->deleteLater(); }
//! [0] AppModel::AppModel(QObject *parent) : QObject(parent), d(new AppModelPrivate) { //! [0] d->fcProp = new QQmlListProperty<WeatherData>(this, d, forecastAppend, forecastCount, forecastAt, forecastClear); d->geoReplyMapper = new QSignalMapper(this); d->weatherReplyMapper = new QSignalMapper(this); d->forecastReplyMapper = new QSignalMapper(this); connect(d->geoReplyMapper, SIGNAL(mapped(QObject*)), this, SLOT(handleGeoNetworkData(QObject*))); connect(d->weatherReplyMapper, SIGNAL(mapped(QObject*)), this, SLOT(handleWeatherNetworkData(QObject*))); connect(d->forecastReplyMapper, SIGNAL(mapped(QObject*)), this, SLOT(handleForecastNetworkData(QObject*))); connect(&d->delayedCityRequestTimer, SIGNAL(timeout()), this, SLOT(queryCity())); connect(&d->requestNewWeatherTimer, SIGNAL(timeout()), this, SLOT(refreshWeather())); d->requestNewWeatherTimer.start(); //! [1] // make sure we have an active network session d->nam = new QNetworkAccessManager(this); QNetworkConfigurationManager ncm; d->ns = new QNetworkSession(ncm.defaultConfiguration(), this); connect(d->ns, SIGNAL(opened()), this, SLOT(networkSessionOpened())); // the session may be already open. if it is, run the slot directly if (d->ns->isOpen()) this->networkSessionOpened(); // tell the system we want network d->ns->open(); }
void AppModel::handleGeoNetworkData(QObject *replyObj) { QNetworkReply *networkReply = qobject_cast<QNetworkReply*>(replyObj); if (!networkReply) return; if (!networkReply->error()) { //convert coordinates to city name QJsonDocument document = QJsonDocument::fromJson(networkReply->readAll()); QJsonObject jo = document.object(); QJsonValue jv = jo.value(QStringLiteral("name")); const QString city = jv.toString(); if (city != d->city) { if (!d->throttle.isValid()) d->throttle.start(); d->city = city; emit cityChanged(); refreshWeather(); } } networkReply->deleteLater(); }
void AppModel::setCity(const QString &value) { d->city = value; emit cityChanged(); refreshWeather(); }