qt显示天气信息
- 1 发送网络请求获取天气数据
- 1.1 需要包含的头文件
- 1.2 创建QNetworkAccessManager对象
- 1.3 发送请求
- 1.4 获取数据并解析
- 2 天气JSON格式数据
- 3 demo代码
- 4 最终效果
1 发送网络请求获取天气数据
1.1 需要包含的头文件
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
1.2 创建QNetworkAccessManager对象
头文件中定义:
QNetworkAccessManager *manager;
cpp文件中创建对象并绑定槽:
manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
1.3 发送请求
void MainWindow::sendQuest(QString cityStr)
{
char quest_array[256] = "http://wthrcdn.etouch.cn/weather_mini?city=";
QNetworkRequest quest;
sprintf(quest_array, "%s%s", quest_array, cityStr.toUtf8().data());
quest.setUrl(QUrl(quest_array));
quest.setHeader(QNetworkRequest::UserAgentHeader, "RT-Thread ART");
manager->get(quest);
}
1.4 获取数据并解析
void MainWindow::replyFinished(QNetworkReply *reply)
{
QString all = reply->readAll();
ui->textBrowser->setText(all);
QJsonParseError err;
QJsonDocument json_recv = QJsonDocument::fromJson(all.toUtf8(), &err);
qDebug() << "recv weather data! error:"<< err.error;
if (!json_recv.isNull())
{
QJsonObject object = json_recv.object();
if (object.contains("data"))
{
QJsonValue value = object.value("data");
if (value.isObject())
{
QJsonObject object_data = value.toObject();
if (object_data.contains("forecast"))
{
QJsonValue value = object_data.value("forecast");
if (value.isArray())
{
QJsonObject today_weather = value.toArray().at(0).toObject();
QString weather_type = today_weather.value("type").toString();
QString tuijian = object.value("data").toObject().value("ganmao").toString();
QString low = today_weather.value("low").toString();
QString high = today_weather.value("high").toString();
QString wendu = low.mid(low.length() - 4, 4) + "~" + high.mid(high.length() - 4, 4);
QString strength = today_weather.value("fengli").toString();
strength.remove(0, 8);
strength.remove(strength.length() - 2, 2);
QString fengli = today_weather.value("fengxiang").toString() + strength;
ui->label_weather_2->setText(weather_type);
ui->label_temperature_2->setText(wendu);
ui->label_wind_2->setText(fengli);
ui->label_recommend_2->setText(tuijian);
}
}
}
}
}
else
ui->label_recommend_2->setText( "json_recv is NULL or is not a object !");
reply->deleteLater();
}
2 天气JSON格式数据
{
"data":
{
"yesterday":
{
"date":"21日星期日",
"high":"高温 26℃",
"fx":"南风",
"low":"低温 16℃",
"fl":"<![CDATA[2级]]>",
"type":"多云"
},
"city":"广州",
"forecast":[
{
"date":"22日星期一",
"high":"高温 28℃",
"fengli":"<![CDATA[2级]]>",
"low":"低温 14℃",
"fengxiang":"南风",
"type":"多云"
},
{
"date":"23日星期二",
"high":"高温 29℃",
"fengli":"<![CDATA[2级]]>",
"low":"低温 16℃",
"fengxiang":"东南风",
"type":"多云"
},
{
"date":"24日星期三",
"high":"高温 28℃",
"fengli":"<![CDATA[3级]]>",
"low":"低温 17℃",
"fengxiang":"南风",
"type":"多云"
},
{
"date":"25日星期四",
"high":"高温 26℃",
"fengli":"<![CDATA[2级]]>",
"low":"低温 18℃",
"fengxiang":"东南风",
"type":"小雨"
},
{
"date":"26日星期五",
"high":"高温 25℃",
"fengli":"<![CDATA[3级]]>",
"low":"低温 18℃",
"fengxiang":"东北风",
"type":"小雨"
}],
"ganmao":"感冒易发期,外出请适当调整衣物,注意补充水分。",
"wendu":"18"
},
"status":1000,
"desc":"OK"
}
3 demo代码
ui文件
随意定一下布局如下,右侧控件名需要与代码中对应。
h文件(mainwindows.h)
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "customscroll.h"
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void replyFinished(QNetworkReply *reply);
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
CustomScroll *tableMove;
QNetworkAccessManager *manager;
void sendQuest(QString cityStr);
};
#endif
cpp文件(mainwindows.cpp)
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QStandardItemModel>
#include <QScrollBar>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QStringList cityList = QString("广州,北京,上海,深圳").split(",");
ui->comboBox->addItems(cityList);
manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
QString local_city = ui->comboBox->currentText().trimmed();
sendQuest(local_city);
}
void MainWindow::sendQuest(QString cityStr)
{
char quest_array[256] = "http://wthrcdn.etouch.cn/weather_mini?city=";
QNetworkRequest quest;
sprintf(quest_array, "%s%s", quest_array, cityStr.toUtf8().data());
quest.setUrl(QUrl(quest_array));
quest.setHeader(QNetworkRequest::UserAgentHeader, "RT-Thread ART");
manager->get(quest);
}
void MainWindow::replyFinished(QNetworkReply *reply)
{
QString all = reply->readAll();
ui->textBrowser->setText(all);
QJsonParseError err;
QJsonDocument json_recv = QJsonDocument::fromJson(all.toUtf8(), &err);
qDebug() << "recv weather data! error:"<< err.error;
if (!json_recv.isNull())
{
QJsonObject object = json_recv.object();
if (object.contains("data"))
{
QJsonValue value = object.value("data");
if (value.isObject())
{
QJsonObject object_data = value.toObject();
if (object_data.contains("forecast"))
{
QJsonValue value = object_data.value("forecast");
if (value.isArray())
{
QJsonObject today_weather = value.toArray().at(0).toObject();
QString weather_type = today_weather.value("type").toString();
QString tuijian = object.value("data").toObject().value("ganmao").toString();
QString low = today_weather.value("low").toString();
QString high = today_weather.value("high").toString();
QString wendu = low.mid(low.length() - 4, 4) + "~" + high.mid(high.length() - 4, 4);
QString strength = today_weather.value("fengli").toString();
strength.remove(0, 8);
strength.remove(strength.length() - 2, 2);
QString fengli = today_weather.value("fengxiang").toString() + strength;
ui->label_weather_2->setText(weather_type);
ui->label_temperature_2->setText(wendu);
ui->label_wind_2->setText(fengli);
ui->label_recommend_2->setText(tuijian);
}
}
}
}
}
else
ui->label_recommend_2->setText( "json_recv is NULL or is not a object !");
reply->deleteLater();
}
4 最终效果
目前只是获取信息,做最基本的信息显示,需要的话可以将信息统计显示,或者如下图所示,可以把界面做的更漂亮一些。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)