您的位置:首页 > 其它

实现简单的天气预报功能

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)
{
//申请所得信息赋值给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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: