QT获取实时天气数据信息(vs2017)

vs版本:2017
qt版本:qt5

为了实现自己的设计,今天试一试利用接口来获取网络数据,搜了搜资料发现,网上的天气数据较多,采用这个。

首先是利用vs2017创建一个qt的项目,我用的wiget,创建好之后,在.pro 文件中添加语句

QT       += network

可是这时问题就来了,.pro文件只有qtcreator才会生成,vs是没有的,这时我们需要在项目中生存.pro 文件。
在这里插入图片描述
这样就能找到了,添加上述语句;
在这里插入图片描述
之后就是添加代码:
首先是在头文件中添加网页需要的头文件:

#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>

然后是添加需要的读取JSON文件的头文件:

#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>

头文件代码:

#pragma once

#include <QtWidgets/QWidget>
#include "ui_widget.h"

#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>

#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>

class widget : public QWidget
{
	Q_OBJECT

public:
	widget(QWidget *parent = 0);


private slots:
	void checkW();
	void replyFinished(QNetworkReply *reply);
private:
	Ui::widgetClass *ui;

	QNetworkAccessManager *manager;  //请求句柄
	QString fengli;       //风力
	QString wendu;        //温度
	QString weather_type;  //天气类型
};

源文件:

#include "widget.h"

widget::widget(QWidget *parent)
	: QWidget(parent),
	ui(new Ui::widgetClass)
{
	ui->setupUi(this);
	manager = new QNetworkAccessManager(this);  //新建QNetworkAccessManager对象
	connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));//关联信号和槽
	connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(checkW()));//关联信号和槽

}

void widget::checkW() //点击查询请求天气数据
{
	QString local_city = ui->lineEdit->text().trimmed(); //获得需要查询天气的城市名称
	char quest_array[256] = "http://wthrcdn.etouch.cn/weather_mini?city=";
	QNetworkRequest quest;
	sprintf(quest_array, "%s%s", quest_array, local_city.toUtf8().data());
	quest.setUrl(QUrl(quest_array));
	quest.setHeader(QNetworkRequest::UserAgentHeader, "RT-Thread ART");
	/*发送get网络请求*/
	manager->get(quest);
}

void widget::replyFinished(QNetworkReply *reply)  //天气数据处理槽函数
{
	qDebug() << "recv weather data!!";
	QString all = reply->readAll();

	//ui->textBrowser->setText(all); //将接收到的数据显示出来

	QJsonParseError err;
	QJsonDocument json_recv = QJsonDocument::fromJson(all.toUtf8(), &err);//解析json对象
	qDebug() << err.error;
	if (!json_recv.isNull())
	{
		QJsonObject object = json_recv.object();

		if (object.contains("data"))
		{
			QJsonValue value = object.value("data");  // 获取指定 key 对应的 value
			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();
						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();
						wendu = low.mid(low.length() - 3, 4) + "~" + high.mid(high.length() - 3, 4);
						QString strength = today_weather.value("fengli").toString();
						strength.remove(0, 8);
						strength.remove(strength.length() - 2, 2);
						fengli = today_weather.value("fengxiang").toString() + strength;
						ui->type->setText(weather_type); //显示天气类型
						ui->wendu->setText(wendu);   //显示温度
						ui->fengli->setText(fengli); //显示风力
						ui->textBrowser2->setText(tuijian);
					}
				}
			}
		}

	}
	else
	{
		qDebug() << "json_recv is NULL or is not a object !!";
	}
	reply->deleteLater(); //销毁请求对象
}

ui设计:
在这里插入图片描述
前四个是lineEdit,推荐是textBrowser,按照代码中修改名字。

效果:
在这里插入图片描述
完成。
参考:基于QT5 HTTP GET方式获取天气信息
Qt5获取并解析中国天气网数据

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
### 回答1: Qt界面通过网络获取天气信息的过程,一般可以分为以下几个步骤: 第一步,创建请求对象。使用Qt提供的QNetworkRequest类创建一个请求对象,设置请求的URL地址以及请求的Header信息。 第二步,发送请求。使用Qt的QNetworkAccessManager类发送上述请求对象,调用其get()函数即可发送请求。 第三步,接收相应。Qt的QNetworkAccessManager类会自动接收到服务器的相应信息,可以通过其finished()信号捕捉到这个事件,回调函数中则可以读取响应的信息。 第四步,解析数据。一般天气信息返回的是Json格式数据,我们需要使用Qt的Json解析器Qt Json来解析数据,将其转换成相应的数据结构,例如用QJsonObject表示城市名、温度、天气状况等信息。 第五步,更新UI。将第四步中解析得到的数据结构,通过Qt界面的QLabel、QTextBrowser等控件,动态地更新显示在界面上。 需要注意在整个网络获取天气信息的过程中,需要添加相应的错误处理,例如网络连接失败、天气数据解析出错等等情况,以保证界面能够及时地响应用户的操作。 ### 回答2: Qt界面是一种基于C++的图形用户界面开发框架。这种框架可以帮助开发者创建出漂亮、易于使用、跨平台的应用程序界面。Qt界面中内置了许多通信和网络相关的类库,使得开发者可以很方便地利用网络进行数据获取和传输。 获取天气信息通常需要连接到一个天气服务的API,通过发送HTTP请求来获取数据,再将数据解析回传给应用程序进行处理。在Qt界面中,可以使用QNetworkAccessManager等相关类库来实现这个过程。具体而言,可以通过下列步骤来实现: 1. 创建一个QNetworkAccessManager对象,该对象可以用于发送HTTP请求和接收响应数据。 2. 构造HTTP请求对象。对于获取天气信息,通常需要指定一个特定的URL,以及HTTP请求头部的一些参数,例如浏览器类型、语言等。 3. 发送HTTP请求,并等待响应。当响应数据到达时,QNetworkAccessManager对象会发出相应的信号,用于通知应用程序已经得到响应数据。 4. 按照天气API返回的格式,解析响应数据,并提取所需要的信息。这部分工作需要根据具体API的规定进行实现。 5. 将解析获得的天气信息显示在Qt界面上。这一过程中,可以利用Qt的控件和布局等功能,将获取到的信息以适当的方式进行展示。 综上所述,Qt界面通过网络获取天气信息可以利用QNetworkAccessManager等类库,通过发送HTTP请求、解析响应数据实现。这种方法具有可靠性高、代码清晰等优点,可以满足大多数天气API的调用需求。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值