[原创] 【STM32MP135F-DK】9-网络测评,用QT显示网络天气

qiao---   2024-1-4 17:59 楼主

我们在之前已经成功移植了qt,现在可以进行qt界面的开发,本次测评我打算测试一下板子的网络功能,而测评的主要方式就是利用网上的api获取网络天气,最终在qt上显示。

 

1.在网上找一个可以获取天气的api

我用的是下面这个链接http://query.asilu.com/weather/baidu/,当我们进入这个链接的时候,会显示一系列的JSON数据,如下图,而我们要做的就是解析下面的这个JSON数据

image.png   2.创建qt工程

我们打开Linux虚拟机下面的qtCreator,工程创建模式按照我之前的测评就可以【STM32MP135F-DK】7-部署QT开发环境+运行第一个QT程序 https://bbs.eeworld.com.cn/thread-1267168-1-1.html

我们在.pro文件下加入network,这个可以加入一些网络的库。

image.png  

接着我们构建一个简单的界面,我是直接拖用qtCreator现有的图形库,我用的是如下的布局。记着要设置窗口的大小要为480*272,这个在我之前的测评也有讲过,我这里就不在赘述。

image.png  

然后在widget.h中添加以下的代码(我这里就把所有的代码展示了)

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QtNetwork>//网络类
#include <QNetworkAccessManager>//网络管理类
//Json数据类
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots: //槽函数
    void slot_http(QNetworkReply* reply);//网络连接
    void slot_pushButton_consult();//查询按钮

private:
    Ui::Widget *ui;
    QNetworkAccessManager* http;
};
#endif // WIDGET_H

在widget.cpp中添加下面的代码,这里主要是用了一些函数对JSON数据进行了解析。

#include "widget.h"
#include "ui_widget.h"


Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    http = new QNetworkAccessManager;
    http->get(QNetworkRequest(QUrl(QString("http://query.asilu.com/weather/baidu/?city=%1").arg(ui->comboBox_city->currentText()))));//连接天气网站
    connect(http,SIGNAL(finished(QNetworkReply*)),this,SLOT(slot_http(QNetworkReply *)));//调用槽函数

}

Widget::~Widget()
{
    delete ui;
}
void Widget::slot_http(QNetworkReply *reply)
{
    QByteArray Data = reply->readAll();
    QJsonDocument JsonDocument = QJsonDocument::fromJson(Data);
    QJsonObject JsonObject = JsonDocument.object();
    QString City = JsonObject["city"].toString();
    ui->textEdit->setText("");
    for(int i = 0;i < 7;++i)
    {
        QString date = JsonObject["weather"].toArray()[i].toObject()["date"].toString();
        QString weather = JsonObject["weather"].toArray()[i].toObject()["weather"].toString();
        QString temp = JsonObject["weather"].toArray()[i].toObject()["temp"].toString();
        QString wind = JsonObject["weather"].toArray()[i].toObject()["wind"].toString();
        ui->textEdit->append(date+"  "+weather+"  "+temp+"  "+wind);
    }
}

void Widget::slot_pushButton_consult()
{
    http->get(QNetworkRequest(QUrl(QString("http://query.asilu.com/weather/baidu/?city=%1").arg(ui->comboBox_city->currentText()))));
}


我们可以在电脑上先预览一下效果在移植到板子上。

image.png  

3.编译并移植到板子上看看效果

我们用qmake && make编译我们的工程,并拷贝到我们的板子上用scp命令拷贝就行,我在终端执行我的qt可执行文件就在屏幕上出现了以下效果

image.png  

我这里只添加了四个直辖市的天气,有兴趣的小伙伴可以把所有的城市都实现出来。

image.png  

 

总结:开发板通过api获取网络天气可以准确的获取到网络中的数据,网络连接的稳定性较好,数据传输也很准确。

本帖最后由 qiao--- 于 2024-1-4 18:03 编辑

回复评论 (4)

开发板通过api获取网络天气可以准确的获取到网络中的数据,网络连接的稳定性较好,数据传输也很准确。

大佬的帖子,牛呀,遍地开花!

点赞  2024-1-4 21:19
引用: lugl4313820 发表于 2024-1-4 21:19 开发板通过api获取网络天气可以准确的获取到网络中的数据,网络连接的稳定性较好,数据传输也很准确。 ...

感谢佬的支持


点赞  2024-1-5 13:27

有点windows2000的感觉,感觉美工上场设计几个图片吧 

在爱好的道路上不断前进,在生活的迷雾中播撒光引
点赞  2024-1-5 15:00
引用: 秦天qintian0303 发表于 2024-1-5 15:00 有点windows2000的感觉,感觉美工上场设计几个图片吧 

所言极是,我移植的Windows的字库显示的缘故吧

点赞  2024-1-7 21:09
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复