实现简单的天气预报功能
2016-11-25 20:12
681 查看
头文件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){//申请所得信息赋值给weatherDataweatherData = 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;}
相关文章推荐
- .net请求Webservice简单实现天气预报功能
- .net请求Webservice简单实现天气预报功能
- Angular实现的简单查询天气预报功能示例
- Java中使用WebService实现简单的天气预报功能
- AngularJs实现一个简单的天气预报功能
- android使用soap协议访问webservice实现天气预报功能
- delphi Indy 实现天气预报功能
- 【小项目】简单天气预报项目的实现与流程
- Java WEB天气预报功能实现
- 天气预报的功能实现(使用聚合的提供的外部接口)
- 实现天气预报功能
- Jquery和雅虎的YQL服务实现天气预报功能!
- 调用API实现天气预报功能!
- 安卓实现天气预报功能
- 天气预报功能--查询广州天气的实现
- 安卓实现天气预报功能
- Android上实现一个简单的天气预报APP(十二) 未来三天的天气预报
- 微信订阅号天气预报功能的实现(java版)
- The First DIY------基于树莓派3代实现定时播放天气预报功能
- ASP.NET使用WebService实现天气预报功能