QT通过API获取天气信息



刚做了一个获取网站返回的天气信息然后再显示在lable上

.cpp

#include "mainwindow.h"

/*流程图
 * 先是按钮点击->转到槽函数btn_1_clicked->槽函数里面连接网站信息通过connect->replyfinished(QNetworkReply *reply)
 * 这个函数是读取返回的数据并储存->调用init(QString str)进行解析返回来的数据,并显示在布局好的lable上
*/
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
 
{
    this->resize(800,600);
    move(0,0);
    QFont font("Times", 10, QFont::Bold);
    btn_1 = new QPushButton("tianqi",this);
    btn_1->setFixedSize(100,50);
//    lab1 =  new QLabel(this);
//    lab1->setFont(font);
//    lab1->setGeometry(0,300,800,300);
//    lab1->setStyleSheet("background-color: rgb(159, 255, 144);");
//    lab1->setWordWrap(true);
    QLabel *lab_1 = new QLabel(this);
    lab_1->setGeometry(50,0,700,50);
    QDateTime data = QDateTime::currentDateTime();
 
    lab_1->setFont(font);
    lab_1->setText(data.toString("yyyy-MM-dd  hh:mm"));
    lab_1->setAlignment(Qt::AlignCenter);//设置文字居中
    connect(btn_1,SIGNAL(clicked(bool)),this,SLOT(btn_1_clicked()));
 
 
 
    QLabel *lab = new QLabel(this);
    lable.append(lab);
    QFont fo("Times",15,QFont::Bold);
    lab->setFont(fo);
    lab->setGeometry(550,170,150,150);
    lab->setWordWrap(true);
 
    QLabel *lab_2 = new QLabel(this);
    lable.append(lab_2);
    QFont f("Times",30,QFont::Bold);
    lab_2->setFont(f);
    lab_2->setGeometry(150,150,300,100);
 
    QLabel *lab_3 = new QLabel(this);
    lable.append(lab_3);
    QFont f1("Times",20,QFont::Bold);
    lab_3->setFont(f1);
    lab_3->setGeometry(150,250,55,50);
    layout();
 
}
 
MainWindow::~MainWindow()
{
 
}
 
void MainWindow::btn_1_clicked()
{
    manage = new QNetworkAccessManager(this);
    QNetworkRequest network_request;
    network_request.setUrl(QUrl("http://wthrcdn.etouch.cn/weather_mini?citykey=101020100"));
//    network_request.setHeader(QNetworkRequest::UserAgentHeader,QVariant::BitArray);
    connect(manage,SIGNAL(finished(QNetworkReply *)),this,SLOT(replyfinished(QNetworkReply*)));
//    manage->get(QNetworkRequest(QUrl("http://int.dpool.sina.com.cn/iplookup/iplookup.php")));
//    manage->get(QNetworkRequest(QUrl("http://int.dpool.sina.com.cn/iplookup/iplookup.php")));
    manage->get(network_request);
//    manage->get(QNetworkRequest(QUrl("http://pv.sohu.com/cityjson?ie=utf-8")));
 
}
 
void MainWindow::replyfinished(QNetworkReply *reply)
{
 
    QVariant status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
    if(reply->error() == QNetworkReply::NoError)
    {
        bytes = reply->readAll();
        QString add(bytes);
        qDebug()<<add;
        all = add;
        init(add);
//        lab1->setText(add);
 
    }
 
    reply->deleteLater();
}
/*返回的数据"{\"data\":
        {\"yesterday\":
                    {
                        \"date\":\"11日星期一\",
                        \"high\":\"高温 10℃\",
                        \"fx\":\"北风\",
                        \"low\":\"低温 5℃\",
                        \"fl\":\"<![CDATA[<3级]]>\",
                        \"type\":\"晴\"
                    },
                        \"city\":\"上海\",
                        \"aqi\":\"37\",
                        \"forecast\":
                                    [{\"date\":\"12日星期二\",
                                    \"high\":\"高温 10℃\",
                                    \"fengli\":\"<![CDATA[3-4级]]>\",
                                    \"low\":\"低温 6℃\",
                                    \"fengxiang\":\"东北风\",
                                    \"type\":\"多云\"},
                                    {\"date\":\"13日星期三\",
                                    \"high\":\"高温 11℃\",
                                    \"fengli\":\"<![CDATA[3-4级]]>\",
                                    \"low\":\"低温 7℃\",
                                    \"fengxiang\":\"东北风\",
                                    \"type\":\"阴\"},
                                    {\"date\":\"14日星期四\",
                                    \"high\":\"高温 10℃\",
                                    \"fengli\":\"<![CDATA[3-4级]]>\",
                                    \"low\":\"低温 8℃\",
                                    \"fengxiang\":\"东北风\",
                                    \"type\":\"阴\"},
                                    {\"date\":\"15日星期五\",
                                    \"high\":\"高温 12℃\",
                                    \"fengli\":\"<![CDATA[<3级]]>\",
                                    \"low\":\"低温 6℃\",
                                    \"fengxiang\":\"东北风\",
                                    \"type\":\"小雨\"},
                                    {\"date\":\"16日星期六\",
                                    \"high\":\"高温 9℃\",
                                    \"fengli\":\"<![CDATA[3-4级]]>\",
                                    \"low\":\"低温 3℃\",
                                    \"fengxiang\":\"北风\",
                                    \"type\":\"小雨\"}],
        \"ganmao\":\"天气较凉,较易发生感冒,请适当增加衣服。体质较弱的朋友尤其应该注意防护。\",
        \"wendu\":\"9\"
        },
\"status\":1000,\"desc\":\"OK\"}"*/
void MainWindow::init(QString str)//读取json数据
{
    QByteArray byte_array;
    QJsonParseError json_error;
    QJsonDocument document = QJsonDocument::fromJson(byte_array.append(str),&json_error);
    if(json_error.error == QJsonParseError::NoError)
    {
         QJsonObject obj = document.object();
         QJsonValue value  = obj.take("desc");//qjsonvalue生成json文档中对象的值的对象
         if(value.toString() != "OK")
         {
//             QMessageBox::warning(this,QString::fromLocal8Bit("抱歉"),QString::fromLocal8Bit("暂无此城市信息"),QMessageBox::Ok,QMessageBox::Ok);
             QMessageBox::warning(this,"抱歉","暂无此城市的天气情况",QMessageBox::Ok,QMessageBox::Ok);
 
             return;
         }
         QJsonValue da = obj.take("data");//获取data数据对象里面的值
         data.ganmao = da.toObject().take("ganmao").toString();//da.toobject()表示的是data对象里面的对象,tostring再将它转换成string类型
         data.wendu = da.toObject().take("wendu").toString();
         data.city = da.toObject().take("city").toString();
         qDebug()<<"1111111111111111111111"<<data.ganmao;
 
        lable.at(0)->setText(data.ganmao);
//        lable.at(1)->setText(QString::fromLocal8Bit("%1℃").arg(data.wendu));
        //QString使用%1、%2~%99的参数范围显示或储存字符串
        /*举个栗子
         * QString i = "10";
         * QString j = "25";
         * Qstring filename = "test.cpp";
         * QString string = QString("Processing file %1 of %2:%3")
         *                                  .arg(i).arg(j).arg(filename);*/
        lable.at(1)->setText(QString::fromLocal8Bit("%1℃").arg(data.wendu));
        lable.at(2)->setText(QString::fromLocal8Bit("%1").arg(data.city));
        QJsonValue da1 = da.toObject().take("forecast");
        QJsonArray array = da1.toArray();
        for(int i =0;i<5;i++)
        {
            QJsonValue value = array.at(i);
            QJsonObject obj = value.toObject();
            forecast[i].fengxiang = obj.take("fengxiang").toString();
            forecast[i].date = obj.take("date").toString();
            forecast[i].fengli = obj.take("fengli").toString();
            forecast[i].high = obj.take("high").toString();
            forecast[i].low = obj.take("low").toString();
            forecast[i].type = obj.take("type").toString();
        }
        for(int i =0;i<5;i++)
        {
//            forecast_date_list[i]->setText(QString::fromLocal8Bit("%1").arg(forecast[i].date));
 
            datalable.at(i)->setText(QString::fromLocal8Bit("%1").arg(forecast[i].date));//贴日期的文本
            templable.at(i)->setText(QString::fromLocal8Bit("%1-%2").arg(forecast[i].low.split(" ").at(1)).arg(forecast[i].high.split(" ").at(1)));//贴温度的文本
//            forecast_temp_list[i]->setText(QString::fromLocal8Bit("%1 - %2").arg(forecast[i].low.split(" ").at(1)).arg(forecast[i].high.split(" ").at(1)));
            qDebug()<<datalable.at(i)->text();
            typelable.at(i)->setPixmap(QPixmap(QString::fromLocal8Bit(":/pic/%1.png").arg(forecast[i].type)));//贴对应的天气图片
 
        }
 
        datalable.at(0)->setText(QString::fromLocal8Bit("   今天"));
    }
}
 
void MainWindow::layout()//布局
{
    QHBoxLayout *layout = new QHBoxLayout(this);
    QHBoxLayout *layout1 = new QHBoxLayout(this);
    QHBoxLayout *layout2 = new QHBoxLayout(this);
    for(int i =0;i<5;i++)
    {
        QLabel *lab = new QLabel(this);
        lab->setFixedSize(50,50);
        lab->setAlignment(Qt::AlignCenter);
        lab->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
        templable.append(lab);
        layout->addWidget(lab);
    }
    for(int i =0;i<5;i++)
    {
        QLabel *lab = new QLabel(this);
        lab->setFixedSize(60,50);
        lab->setAlignment(Qt::AlignLeft);
        lab->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
        datalable.append(lab);
        layout1->addWidget(lab);
    }
    for(int i =0;i<5;i++)
    {
        QLabel *lab = new QLabel(this);
        lab->setFixedSize(60,50);
//        lab->setAlignment(Qt::AlignLeft);
        lab->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
        typelable.append(lab);
        layout2->addWidget(lab);
    }
    QRect rect(0,550,800,50);
    layout->setGeometry(rect);
    QRect rect1(0,450,800,50);
    layout1->setGeometry(rect1);
    QRect rect2(0,500,800,50);
    layout2->setGeometry(rect2);
//    setLayout(layout);
//    setLayout(layout1);
}
.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPushButton>
#include <QtNetwork/QNetworkReply>
#include <QtNetwork/QNetworkAccessManager>
#include <QLabel>
#include <QTextCodec>
#include <QByteArray>
#include <QtNetwork/QNetworkRequest>
#include <QJsonParseError>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonValue>
#include <QMessageBox>
#include <QHBoxLayout>
#include <QJsonArray>
struct DATA{
    QString ganmao;
    QString wendu;
    QString city;
};
struct Forecast
{
    QString date;
    QString high;
    QString fengli;
    QString low;
    QString fengxiang;
    QString type;
};
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
public slots:
    void btn_1_clicked();
    void replyfinished(QNetworkReply *reply);
    void init(QString str);
    void layout();
private:
    QPushButton *btn_1;
    QLabel *lab1;
    QString all;
    DATA data;
    Forecast forecast[5];
    QByteArray bytes;
    QNetworkAccessManager *manage;
    QVector <QLabel *>lable;
    QVector <QLabel *>templable;
    QVector <QLabel *>datalable;
    QVector <QLabel *>typelable;
};
#endif // MAINWINDOW_H

 

                
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搁浅的渔

创作不易,多多支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值