qiao--- 发表于 2024-1-4 17:59

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

<div class='showpostmsg'> 本帖最后由 qiao--- 于 2024-1-4 18:03 编辑

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

<p>&nbsp;</p>

<p><strong><span style="font-size:22px;">1.在网上找一个可以获取天气的api</span></strong></p>

<p>我用的是下面这个链接<a href="http://query.asilu.com/weather/baidu/?city=" rel="nofollow noopener noreferrer" target="_blank">http://query.asilu.com/weather/baidu/</a>,当我们进入这个链接的时候,会显示一系列的JSON数据,如下图,而我们要做的就是解析下面的这个JSON数据</p>

<p><strong><span style="font-size:22px;">&nbsp; 2.创建qt工程</span></strong></p>

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

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

<p> &nbsp;</p>

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

<p> &nbsp;</p>

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

<pre>
<code>#ifndef WIDGET_H
#define WIDGET_H

#include &lt;QWidget&gt;
#include &lt;QtNetwork&gt;//网络类
#include &lt;QNetworkAccessManager&gt;//网络管理类
//Json数据类
#include &lt;QJsonArray&gt;
#include &lt;QJsonDocument&gt;
#include &lt;QJsonObject&gt;

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
</code></pre>

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

<pre>
<code>#include "widget.h"
#include "ui_widget.h"


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

}

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

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


</code></pre>

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

<p> &nbsp;</p>

<p><strong><span style="font-size:22px;">3.编译并移植到板子上看看效果</span></strong></p>

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

<p> &nbsp;</p>

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

<p> &nbsp;</p>

<p>&nbsp;</p>

<p>总结:开发板通过api获取网络天气可以准确的获取到网络中的数据,网络连接的稳定性较好,数据传输也很准确。</p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

lugl4313820 发表于 2024-1-4 21:19

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

<p>大佬的帖子,牛呀,遍地开花!</p>

qiao--- 发表于 2024-1-5 13:27

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

...

<p>感谢佬的支持</p><br/>

秦天qintian0303 发表于 2024-1-5 15:00

<p>有点windows2000的感觉,感觉美工上场设计几个图片吧&nbsp;</p>

qiao--- 发表于 2024-1-7 21:09

秦天qintian0303 发表于 2024-1-5 15:00
有点windows2000的感觉,感觉美工上场设计几个图片吧&nbsp;

<p>所言极是,我移植的Windows的字库显示的缘故吧</p>
页: [1]
查看完整版本: 【STM32MP135F-DK】9-网络测评,用QT显示网络天气