实现简单的天气预报功能

//头文件Widget.h
#include <QWidget>
#include <QLabel>
#include <QNetworkRequest>
#include <QGroupBox>
#include <QPixmap>
#include <QComboBox>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QJsonDocument>
#include <QJsonObject>
#include <QLineEdit>
#include <QFile>
#include <QTextStream>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

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

    QGroupBox *createRightBox();
    //解析Json数据
    void analyseJson();
    void loadFile();
    QGroupBox *createLeftBox();
private slots:
    void finishedReply(QNetworkReply *reply);
    void searchBtnClicked();

private:
    Ui::Widget *ui;
    QLineEdit *cityNameEdit;
    QString cityName;
    QNetworkAccessManager *manager;
    QNetworkReply *reply;
    QNetworkRequest request;
    QUrl url;

    QByteArray weatherData;

    QLabel *city;
    QLabel *cityId;
    QLabel *temp;
    QLabel *wd;
    QLabel *ws;
    QLabel *sd;
    QLabel *wse;
    QLabel *njd;
    QLabel *qy;
    QLabel *rain;

    QLineEdit *cityEdit;
    QLineEdit *tempEdit;
    QLineEdit *wdEdit;

};

//Widget.cpp文件

#include "widget.h"
#include "ui_widget.h"
#include <QGridLayout>
#include <QVBoxLayout>
#include <QPushButton>
#include <QHBoxLayout>
#include <QList>
#include <QDebug>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    setFixedSize(640,350);
    QPalette palette;
    //设置窗体背景图片
    palette.setBrush(QPalette::Background,QBrush(QPixmap("../image/back.jpg")));
    //设置字体颜色
    palette.setColor(QPalette::WindowText,Qt::blue);
    setPalette(palette);
    //加空格原因是加载的txt文件城市名后面有空格
    cityName = "北京 ";
    
    cityNameEdit = new QLineEdit;
    //实现查询功能连接
    QPushButton *btn = new QPushButton("查询");
    connect(btn,SIGNAL(clicked()),this,SLOT(searchBtnClicked()));
    
    //窗体的布局
    QGridLayout *grid = new QGridLayout(this);
    grid->addWidget(createRightBox(),0,1);
    grid->addWidget(createLeftBox(),0,0);
    grid->addWidget(cityNameEdit,1,0);
    grid->addWidget(btn,1,1);
    grid->setColumnStretch(1,1);

    //获取天气信息的服务器
    url="http://www.weather.com.cn/data/sk/101010100.html";
    manager = new QNetworkAccessManager(this);
    //文件访问管理,manager发出请求网络信息信号后执行槽函数
    connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(finishedReply(QNetworkReply*)));
    request.setUrl(url);
    //请求信号发出响应connect连接的槽函数
    manager->get(request);
}

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

QGroupBox *Widget::createRightBox()
{
    QGroupBox *groupBox = new QGroupBox;
    QLabel *cityLabel = new QLabel("City:");
    QLabel *cityidLabel = new QLabel("CityId:");
    QLabel *tempLabel = new QLabel("Temp:");
    QLabel *wdLabel = new QLabel("WD:");
    QLabel *wsLabel = new QLabel("WS:");
    QLabel *sdLabel = new QLabel("SD:");
    QLabel *wseLabel = new QLabel("WSE:");
    QLabel *njdLabel = new QLabel("NJD:");
    QLabel *qyLabel = new QLabel("QY:");
    QLabel *rainLabel = new QLabel("Rain:");

    city = new QLabel;
    //实现Label边框凸形盒子形状
    city->setFrameStyle(QFrame::Box|QFrame::Raised);
    cityId = new QLabel;
    cityId->setFrameStyle(QFrame::Box|QFrame::Raised);
    temp = new QLabel;
    temp->setFrameStyle(QFrame::Box|QFrame::Raised);
    wd = new QLabel;
    wd->setFrameStyle(QFrame::Box|QFrame::Raised);
    ws = new QLabel;
    ws->setFrameStyle(QFrame::Box|QFrame::Raised);
    sd = new QLabel;
    sd->setFrameStyle(QFrame::Box|QFrame::Raised);
    wse = new QLabel;
    wse->setFrameStyle(QFrame::Box|QFrame::Raised);
    njd= new QLabel;
    njd->setFrameStyle(QFrame::Box|QFrame::Raised);
    qy = new QLabel;
    qy->setFrameStyle(QFrame::Box|QFrame::Raised);
    rain= new QLabel;
    rain->setFrameStyle(QFrame::Box|QFrame::Raised);

    QVBoxLayout *leftLayout = new QVBoxLayout;
    leftLayout->addWidget(cityLabel);
    leftLayout->addWidget(cityidLabel);
    leftLayout->addWidget(tempLabel);
    leftLayout->addWidget(wdLabel);
    leftLayout->addWidget(wsLabel);
    leftLayout->addWidget(sdLabel);
    leftLayout->addWidget(wseLabel);
    leftLayout->addWidget(njdLabel);
    leftLayout->addWidget(qyLabel);
    leftLayout->addWidget(rainLabel);

    QVBoxLayout *rightLayout = new QVBoxLayout;
    rightLayout->addWidget(city);
    rightLayout->addWidget(cityId);
    rightLayout->addWidget(temp);
    rightLayout->addWidget(wd);
    rightLayout->addWidget(ws);
    rightLayout->addWidget(sd);
    rightLayout->addWidget(wse);
    rightLayout->addWidget(njd);
    rightLayout->addWidget(qy);
    rightLayout->addWidget(rain);

    QHBoxLayout *mainLayout = new QHBoxLayout;
    mainLayout->addLayout(leftLayout);
    mainLayout->addLayout(rightLayout);

    groupBox->setLayout(mainLayout);

    return groupBox;
}


void Widget::finishedReply(QNetworkReply *reply)
{
    //申请所得信息赋值给weatherData
    weatherData = reply->readAll();
    //解析Json数据
    analyseJson();
}

void Widget::searchBtnClicked()
{
    cityName = cityNameEdit->text();
    loadFile();
    analyseJson();
}

void Widget::loadFile()
{
    QFile file("../image/info.txt");
    file.open(QIODevice::ReadOnly);
    if(!file.isOpen())
    {
        file.close();
        return ;
    }

    QList<QString>::Iterator it;
    QTextStream in(&file);
    while(!in.atEnd()){
        QString str = in.readLine();
        QStringList list = str.split("=",QString::KeepEmptyParts);
        for(it = list.begin(); it!=list.end(); it++)
        {
            if(cityName==*it)
            {
                url = "http://www.weather.com.cn/data/sk/"+QString(*list.begin())+".html";
                request.setUrl(url);
                manager->get(request);
            }
        }
    }
    file.close();
}

void Widget::analyseJson()
{
    QJsonParseError error;
    //个人理解为把数据交给doc进行处理
    QJsonDocument doc = QJsonDocument::fromJson(weatherData,&error);
    //把doc的里面的内容(天气信息)转成Json对象
    QJsonObject obj = doc.object().value("weatherinfo").toObject();
    //获取city信息
    QString cityStr = obj.take("city").toString();
    city->setText(cityStr);
    QString cityIdStr = obj.take("cityid").toString();
    cityId->setText(cityIdStr);
    QString tempStr = obj.take("temp").toString();
    temp->setText(tempStr);
    QString wdStr = obj.take("WD").toString();
    wd->setText(wdStr);
    QString wsStr = obj.take("WS").toString();
    ws->setText(wsStr);
    QString sdStr = obj.take("SD").toString();
    sd->setText(sdStr);
    QString wseStr = obj.take("WSE").toString();
    wse->setText(wseStr);
    QString njdStr = obj.take("njd").toString();
    njd->setText(njdStr);
    QString qyStr = obj.take("qy").toString();
    qy->setText(qyStr);
    QString rainStr = obj.take("rain").toString();
    rain->setText(rainStr);
    cityEdit->setText(cityStr);
    tempEdit->setText(tempStr);
    wdEdit->setText(wdStr);
}

QGroupBox *Widget::createLeftBox()
{
    QGroupBox *groupBox = new QGroupBox;

    QLabel *cityLabel = new QLabel("城市");
    QLabel *tempLabel = new QLabel("气温");
    QLabel *windLabel = new QLabel("风向");

    cityEdit = new QLineEdit;
    cityEdit->setEnabled(false);
    tempEdit = new QLineEdit;
    tempEdit->setEnabled(false);
    wdEdit = new QLineEdit;
    wdEdit->setEnabled(false);

    QHBoxLayout *first = new QHBoxLayout;
    first->addWidget(cityLabel);
    first->addWidget(cityEdit);
    QHBoxLayout *second = new QHBoxLayout;
    second->addWidget(tempLabel);
    second->addWidget(tempEdit);
    QHBoxLayout *third = new QHBoxLayout;
    third->addWidget(windLabel);
    third->addWidget(wdEdit);

    QVBoxLayout *mainLayout = new QVBoxLayout;
    mainLayout->addLayout(first);
    mainLayout->addLayout(second);
    mainLayout->addLayout(third);

    groupBox->setLayout(mainLayout);

    return groupBox;
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值