您的位置:首页 > 编程语言 > Qt开发

QT通过API获取天气信息

2017-12-12 18:30 357 查看
刚做了一个获取网站返回的天气信息然后再显示在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

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: