QT 实现简单的天气 哈哈

news2024/11/27 16:35:01

前 言

前段时间开始接触QT,想着没事学习一下QT,这个小列子主要是用到了QJSON 和QNetworkAccessManager 来实现,QJSON 主要是用来json格式文件的解析,QNetworkAccessManager 主要来实现网络请求。

界面展示

界面上看非常low,但是只是demo,主要是学习使用。
在这里插入图片描述

代码实现

天气业务类
主要实现天气数据的获取,天气数据的组装与解析,以及通知界面端数据的更新等相关操作,直接上代码:
定义部分代码如下:

/*
 * 天气获取类
 */

#ifndef WEATHER_H
#define WEATHER_H

#include <QObject>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QMap>
#include <QMultiMap>

class Weather : public QObject
{
    Q_OBJECT
public:
    explicit Weather(QObject *parent = nullptr);
    explicit Weather(QString cityName = "");

public:
    void setCityName(QString cityName); //设置城市名
    QString getCityName();              //获取城市名
    QString getDate();                  //获取当前日期
    QString getFengLi();                //获取风向风力
    QString getWenDu();                 //获取温度范围
    QString getTianQiType();            //获取天气类型
    QString getCurrentWendu();          //获取当前温度
    QString getGanMaoInfo();            //获取感冒提示
    QString getAllInfo();               //获取原始的所有字段
    bool isGetDataSuccessd();           //是否成功获取数据
    void refresh();                     //刷新
    QMap<QString, QMap<QString, QString> > getDataMap(bool *ok=nullptr);    //获取昨天以及未来5天的天气预测
    void print_Debug_allinfoMap();      //调试打印所有信息

signals:
    void getDataFinisedSignal();//获取数据结束的信号
    void getDataSuccessedSignal();//获取数据成功的信号
    void getDataFailedSignal();//获取数据失败的信号

public slots:
    void replyFinished(QNetworkReply *reply);//刷新的槽

private:
    void queryWeather();//查询

private:
    QString cityName;
    QNetworkAccessManager *manager;  //请求句柄
    QString allinfo;       //所有信息
    //以下皆是当天,未来几天的数据框通过获取日期的数据列表
    QString date;//当前日期
    QString fengli;       //风力
    QString wendu;        //温度
    QString currentwendu;//当前温度
    QString weather_type;  //天气类型
    QString ganmao;//对于感冒提示
    bool isGetData=false;//是否成功获取数据
    QMap<QString,QMap<QString,QString>> dataMap;
};

#endif // WEATHER_H

实现部分如下:

/*
 * 天气获取类
 */
#include "weather.h"

Weather::Weather(QObject *parent) : QObject(parent)
{
    manager = new QNetworkAccessManager(this);  //新建QNetworkAccessManager对象
    connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(replyFinished(QNetworkReply*)));//关联信号和槽
}

Weather::Weather(QString cityName)
{
    manager = new QNetworkAccessManager(this);  //新建QNetworkAccessManager对象
    connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(replyFinished(QNetworkReply*)));//关联信号和槽
    this->cityName=cityName;
    refresh();
}

void Weather::setCityName(QString cityName)
{
    this->cityName=cityName;
}

QString Weather::getCityName()
{
    return this->cityName;
}

/*
 * 获取当前日期
 */
QString Weather::getDate()
{
    return this->date;
}

QString Weather::getFengLi()
{
    return this->fengli;
}

QString Weather::getWenDu()
{
    return this->wendu;
}

QString Weather::getTianQiType()
{
    return this->weather_type;
}

QString Weather::getCurrentWendu()
{
    return this->currentwendu;
}

QString Weather::getGanMaoInfo()
{
    return this->ganmao;
}

QString Weather::getAllInfo()
{
    return this->allinfo;
}

bool Weather::isGetDataSuccessd()
{
    return this->isGetData;
}

/*
 * 刷新天气
 */
void Weather::refresh()
{
    this->currentwendu.clear();
    this->wendu.clear();
    this->ganmao.clear();
    this->fengli.clear();
    this->weather_type.clear();
    this->allinfo.clear();
    queryWeather();
    dataMap.clear();  //刷新的清空,待获取时在加载
}

QMap<QString, QMap<QString, QString> > Weather::getDataMap(bool *ok)
{
    bool Oktemp;
    if(ok==nullptr)
        ok=&Oktemp;
    if(!this->dataMap.isEmpty())
    {
        *ok=true;
        return this->dataMap;
    }
    *ok=false;
    if(!this->isGetData)
        return this->dataMap;
    QJsonParseError err;
    QJsonDocument json_recv = QJsonDocument::fromJson(allinfo.toUtf8(),&err);//解析json对象
    qDebug() <<"Json-Error:"<< err.error;
    if(!json_recv.isNull())
    {
        QJsonObject object = json_recv.object();

            QJsonValue value = object.value("data");  // 获取指定 key 对应的 value
            if(value.isObject())
            {
                QJsonObject object_data = value.toObject();

                    value = object_data.value("daly");
                    if(value.isArray())
                    {
                        QJsonArray valueArray=value.toArray();
                        qDebug()<<"WeatherData count:"<<valueArray.count();
                        for(int i=0;i<valueArray.count();i++)
                        {
                            QJsonObject object = valueArray.at(i).toObject();
                            QMap<QString,QString>mapvalue;
                            mapvalue["high"]=object.value("high").toString();
                            mapvalue["low"]=object.value("low").toString();
                            mapvalue["fengxiang"]=object.value("windDirection").toString();
                            mapvalue["fengli"]=object.value("windScale").toString();
                            mapvalue["type"]=object.value("weather").toString();
                            dataMap[object.value("date").toString()]=mapvalue;
                        }
                        qDebug()<<QString::fromLocal8Bit("获取天气成功");
                        *ok=true;
                        return dataMap;
                    }
              }
    }else
    {
        qDebug()<<"json_recv is NULL or is not a object !!";
    }
    return dataMap;
}

/*
 * qDebug打印Map数据
 */
void Weather::print_Debug_allinfoMap()
{
    getDataMap();
    qDebug()<<endl;
    qDebug()<<"city:"<<this->cityName;
    qDebug()<<"wendu:"<<this->wendu;
    qDebug()<<"currentwendu:"<<this->currentwendu;
    qDebug()<<"fengli:"<<this->fengli;
    qDebug()<<"weather_type:"<<this->weather_type;
    qDebug()<<"ganmao:"<<this->ganmao;
    QString str;
    foreach (QString key, dataMap.keys()) {
        str="date"+key+"[";
        foreach (QString key1, dataMap.value(key).keys()) {
//            qDebug()<<key1<<dataMap.value(key).value(key1);
            str+=key1+':'+dataMap.value(key).value(key1)+' ';
        }
        str+=']';
        qDebug()<<str;
    }
    dataMap.clear();
}

void Weather::replyFinished(QNetworkReply *reply)
{
    this->isGetData=false;
    qDebug()<<"recv weather data!!";
    allinfo = reply->readAll();


    QJsonParseError err;
    QJsonDocument json_recv = QJsonDocument::fromJson(allinfo.toUtf8(),&err);//解析json对象
    qDebug() <<"Json-Error:"<< err.error;
    if(!json_recv.isNull())
    {
        QJsonObject object = json_recv.object();
        if(object.contains("data"))
        {
            QJsonValue dateValue = object.value("data");  // 获取指定 key 对应的 value
            if(dateValue.isObject())
            {
                    QJsonObject object_data = dateValue.toObject();

                    QJsonValue value = object_data.value("daly");
                    if(value.isArray())
                    {
                        QJsonObject today_weather = value.toArray().at(0).toObject();
                        weather_type = today_weather.value("weather").toString();
                        date = today_weather.value("date").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("windScale").toString();
                        strength.remove(0,8);
                        strength.remove(strength.length()-2,2);
                        fengli = today_weather.value("windDirection").toString() + strength;
                        //ui->type->setText(weather_type); //显示天气类型
                        //ui->wendu->setText(wendu);   //显示温度
                        //ui->fengli->setText(fengli); //显示风力
                        this->isGetData=true;
                 }
            }
        }

    }else
    {
        qDebug()<<"json_recv is NULL or is not a object !!";
    }
    reply->deleteLater(); //销毁请求对象
    if(isGetData)
    {
        qDebug()<<QString::fromLocal8Bit("获取天气成功");
        emit this->getDataSuccessedSignal();
    }
    else
    {
        qDebug()<<QString::fromLocal8Bit("获取天气失败");
        emit this->getDataFailedSignal();
    }
    emit this->getDataFinisedSignal();
}


/*
 * 查询天气
 */
void Weather::queryWeather()
{
//    QString local_city = ui->lineEdit->text().trimmed(); //获得需要查询天气的城市名称
    //char quest_array[256]="http://wthrcdn.etouch.cn/weather_mini?city=";
    char quest_array[256]="http://www.jcznedu.com:5000/weather/prediction/?city=";

    QNetworkRequest quest;
    sprintf(quest_array,"%s%s",quest_array,cityName.toUtf8().data());
    quest.setUrl(QUrl(quest_array));
    quest.setHeader(QNetworkRequest::UserAgentHeader,"RT-Thread ART");
    /*发送get网络请求*/
    manager->get(quest);
}

界面部分代码主要是界面的展示,以及按钮的相应事件。
定义部分:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "weather.h"

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void getWeatherFailedSlot();

    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void on_pushButton_3_clicked();

    void on_pushButton_4_clicked();

private:
    Ui::Widget *ui;
    Weather *weather;
    bool isGetData=false;
};

#endif // WIDGET_H

实现部分如下

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QMessageBox>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    weather=new Weather(QStringLiteral("合肥"));
    connect(weather,&Weather::getDataSuccessedSignal,this,&Widget::on_pushButton_clicked);
    connect(weather,SIGNAL(getDataFailedSignal()),this,SLOT(getWeatherFailedSlot()));
}

Widget::~Widget()
{
    delete ui;
}

void Widget::getWeatherFailedSlot()
{
    QMessageBox::warning(this,QString::fromUtf8("获取天气提示"),QString::fromUtf8("获取天气失败,请确认网络是否连接,或城市名的输入"));
}

void Widget::on_pushButton_clicked()
{
        ui->lineEdit_cityName->setText(weather->getCityName());
        ui->lineEdit_date->setText(weather->getDate());
        ui->lineEdit_currentWendu->setText(weather->getCurrentWendu()+QString::fromLocal8Bit("℃"));
        ui->lineEdit_Fengli->setText(weather->getFengLi());
        ui->lineEdit_type->setText(weather->getTianQiType());
        ui->lineEdit_Wendu->setText(weather->getWenDu());
        ui->textBrowser_ganmao->setText(weather->getGanMaoInfo());

        ui->tableWidget->clearContents();
        ui->tableWidget->setRowCount(0);
        QMap<QString,QMap<QString,QString>> map=weather->getDataMap();
        int n=0;
        foreach (QString date, map.keys()) {
            ui->tableWidget->insertRow(ui->tableWidget->rowCount());
            QMap<QString,QString> mapvalue=map.value(date);
            ui->tableWidget->setItem(n,0,new QTableWidgetItem(date));
            ui->tableWidget->setItem(n,1,new QTableWidgetItem(mapvalue.value("type")));
            QString low = mapvalue.value("low");
            QString high = mapvalue.value("high");
            ui->tableWidget->setItem(n,2,new QTableWidgetItem(low.mid(low.length()-3,4) +"-"+ high.mid(high.length()-3,4)));
            QString strength = mapvalue.value("fengli");
            strength.remove(0,8);
            strength.remove(strength.length()-2,2);
            ui->tableWidget->setItem(n,3,new QTableWidgetItem(mapvalue.value("fengxiang") + strength));
            n++;
        }

        qDebug()<<weather->getCityName();
        qDebug()<<QStringLiteral("风力风向")<<weather->getFengLi();
        qDebug()<<QStringLiteral("天气类型")<<weather->getTianQiType();
        qDebug()<<QStringLiteral("温度")<<weather->getWenDu();
//        ui->textBrowser->setText(weather->getAllInfo());
        weather->getDataMap();
}

void Widget::on_pushButton_2_clicked()
{
    weather->refresh();
}

void Widget::on_pushButton_3_clicked()
{
    if(ui->lineEdit->text().isEmpty())
        return;
    weather->setCityName(ui->lineEdit->text());
    weather->refresh();
}

void Widget::on_pushButton_4_clicked()
{
    weather->print_Debug_allinfoMap();
}

总结:

通过上面的代码就可以实现简单的网络请求服务端来展示简单的天气情况,数据源也是在网络上找到的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/27067.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决java: 程序包org.springframework.boot不存在的解决方法

问题描述 最近IDEA抽风了&#xff0c;不管是新建SpringBoot工程&#xff0c;还是导入项目。 IDEA代码里面都会飘红~ Build项目时&#xff0c;会提示错误&#xff1a;错误:(3, 32) java: 程序包org.springframework.boot不存在 后来找到一个靠谱的解决方案&#xff0c;建议使…

Java如何安装https证书

Java为什么需要证书&#xff1f; 出于安全的考虑&#xff0c;很多网站都使用https 协议&#xff0c;而要访问一个https 的站点则需要一个证书文件&#xff0c;这些证书文件由CA (Certificate Authority) 颁布&#xff0c; 各站点将这些认证过的证书放在各自的服务器上&#xf…

深度解析:为何在 SwiftUI 视图的 init 初始化器里无法更改 @State 的值?

问题现象 如下代码所示,我们希望用 “hopy” 初始化 ContentView 中的 secret 属性,但是最终 ContentView 显示时, secret 的值仍旧为默认值 “none” ! 为什么会出现这种情况呢? 其实答案就在 @State 包装器属性内部实现机制上,它比表面看起来要复杂那么一丢丢。 在本…

第十四届校模拟赛第一期(一)

“须知少时凌云志&#xff0c;自许人间第一流” 鄙人11月八号有幸参加学校校选拔赛&#xff0c;题型为5道填空题&#xff0c;5道编程题&#xff0c;总时间为4小时。奈何能力有限&#xff0c;只完成了5道填空和3道编程大题&#xff0c;现进行自省自纠&#xff0c;分享学习&#…

Unity | Cinemachine 2D 设置边界及错误记录

1 背景介绍 在使用大地图的项目中&#xff0c;通常需要摄像机跟随玩家移动&#xff0c;而且需要根据地图尺寸限制摄像机的边界 借助 Cinemachine 及其扩展组件 CinemachineConfiner 可以很方便的实现该功能&#xff0c;但这次遇见一个问题&#xff1a;运行时&#xff0c;当摄…

世界杯今日胜负预测(阿根廷VS沙特阿拉伯,丹麦VS突尼斯)

首先是今天开局的两场 阿根廷VS沙特阿拉伯————阿根廷胜 理由&#xff1a; 1、国家队世界男足排名第三 2、在今年阿根廷的近期战绩 3、经常关注世界杯的粉丝观点 4、抖音平台预测数据&#xff0c;截止时间14:46 丹麦VS突尼斯————丹麦胜 理由&#xff1a; 1、丹麦国…

CPT-CY3/CY5/CY7/CY7.5/花菁染料CY3/Y5/CY7/CY7.5/抗Trop-2 IgG抗体偶联顺铂的制备

小编今天给大家分享了CPT-CY3/CY5/CY7/CY7.5/花菁染料CY3/Y5/CY7/CY7.5/抗Trop-2 IgG抗体偶联顺铂的制备方法&#xff0c;一起来看看。 抗Trop-2 IgG抗体偶联顺铂的制备&#xff1a; 转染Trop-2质粒至293F细胞,利用Protein A亲和柱纯化,获得人源抗Trop-2 IgG抗体.酶联免疫吸附…

Qt Quick-PySide2使用qrc文件

Qt Quick中PySide2使用qrc文件、Controls2设置全局样式、VSCode任务。 使用步骤 创建一个 resource.qrc 文件 <RCC><qresource prefix"/"><file>qtquickcontrols2.conf</file><file>images/images.png</file></qresource&…

反射、类的加载时机、类加载过程的详细流程图

目录 一、反射 1、静态加载 2、动态加载 二、类加载的时机 三、类加载的流程图 四、类加载的三个阶段的详细解释 1.1 加载 1.2 连接 1、验证 2、准备 3、解析 1.3 初始化 一、反射 反射机制是java实现动态语言的关键&#xff0c;也就是哦天哪故宫反射实现类动态加载…

Linux安装Oracle19c(极简版)

Oracle下载oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpmoracle-database-ee-19c-1.0-1.x86_64.rpmOracle安装 cd /opt yum -y localinstall oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm yum -y localinstall oracle-database-ee-19c-1.0-1.x86_64.rpm 环境变…

RHCE学习 --- 第八次作业(ansible)

RHCE学习 — 第八次作业&#xff08;ansible&#xff09; \ 一、基础环境&#xff1a; 采用一台centos7的主机为控制节点master&#xff0c;两台centos8的主机为受控节点&#xff08;node01&#xff0c;node02&#xff09; 三台主机均安装ansible并可以使用 三台主机有IP地…

My Sixty-seventh Page - 0-1背包问题理论 - By Nicolas

小尼在这里跟大家说明一下0-1背包问题的理论&#xff0c;首先我们需要认识一下什么是背包问题。小尼在这里拉一下代码随想录的代码&#xff0c;有兴趣的小伙伴也想把背包问题学好&#xff0c;可以去代码随想录看一看背包问题的讲解&#xff0c;也可以去B站看一看代码随想录对背…

java项目-第158期ssm仓库智能仓储系统_java毕业设计_计算机毕业设计

java项目-第158期ssm仓库智能仓储系统_java毕业设计_计算机毕业设计 今天分享的项目是《ssm仓库智能仓储系统》 该项目分为3个角色&#xff0c;管理员、员工、供应商。 员工角色登录后台&#xff0c;主要负责流水线工作&#xff0c;比如&#xff1a;查看供应商、 货物采购管理…

【计算机视觉OpenCV基础】实验一 图像预处理

实验一 图像预处理 计算机视觉OpenCV基础实验合辑&#xff08;实验1234扩展&#xff09; 资源下载地址&#xff1a; https://download.csdn.net/download/weixin_53403301 合辑&#xff1a;&#xff08;加在下载地址后面&#xff09; /87113581 讲义&#xff08;包括理论、图例…

MCE | 分子伴侣介导的自噬

自噬是细胞在外界环境因素的影响下&#xff0c;利用溶酶体&#xff0c;降解自身受损、变性大分子物质或者细胞器的自我消化过程。依据其发生途径&#xff0c;主要分为三种&#xff1a;巨自噬 (Macroautophagy)&#xff0c;微自噬 (Microautophagy) 和分子伴侣介导的自噬 (Chape…

MyBatis 缓存机制

文章目录一、一级缓存二、二级缓存1.cache 元素2.缓存命中率一、一级缓存 MyBatis 的一级缓存是 SqlSession 级别的缓存。如果同一个 SqlSession 对象多次执行完全相同的 SQL 语句&#xff0c;在第一次执行完成后&#xff0c;MyBatis 会将查询结果写入一级缓存中&#xff0c;此…

mysql中的binlog用法

binlog是什么 MySQL的二进制日志binlog可以说是MySQL最重要的日志&#xff0c;它记录了所有的DDL和DML语句&#xff08;除了数据查询语句select&#xff09;,以事件形式记录&#xff0c;还包含语句所执行的消耗的时间&#xff0c;MySQL的二进制日志是事务安全型的。使用mysqlb…

Kotlin语法学习(四)_空指针检查

空指针检查 空指针异常是一种不受编程语言检查的运行时异常,只能由程序员主动通过逻辑判断来避免,所以空指针异常往往比较容易出这个问题 可空类型系统 在Kotlin当中利用了编译时判空检查的机制几乎杜绝了空指针异常,Kotlin提供了一些列的工具,让我们能够轻松处理各种判空情…

Verilog 随机数及概率分布

随机数 Verilog 中使用系统任务 $random(seed) 产生随机数&#xff0c;seed 为随机数种子。seed 值不同&#xff0c;产生的随机数也不同。如果 seed 相同&#xff0c;产生的随机数也是一样的。可以为 seed 赋初值&#xff0c;也可以忽略 seed 选项&#xff0c;seed 默认初始值为…

130. 被围绕的区域

130. 被围绕的区域 给你一个 m∗nm * nm∗n 的矩阵 board &#xff0c;由若干字符 ‘X’ 和 ‘O’ &#xff0c;找到所有被 ‘X’ 围绕的区域&#xff0c;并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。 实例1&#xff1a; 输入&#xff1a;board [[“X”,“X”,“X”,“X”],…