Qt实现天气预报与PM2.5监测系统(7)今日天气
程序界面
主要显示两部分内容:1.通过云端的API接口获取的天气数据,2.通过本地的 PM2.5 与温湿度模块获取的数据。
今天天气功能界面,由类ShowToday(派生于QWidget)实现。
主界面程序中初始化一个ShowToday实例。
//初始化今日天气界面
showToday = new ShowToday(this);室内数据更新接口void setInsideVal(QString value);
网络天气更新接口void updateVal(QString *daily);
代码
头文件
#ifndef SHOWTODAY_H
#define SHOWTODAY_H
#include <QtGui>
#include "showlabel.h"
class ShowToday : public QWidget
{
Q_OBJECT
public:
ShowToday(QWidget *parent=0);
void updateVal(QString *daily);
void setInsideVal(QString value);
public slots:
private:
ShowLabel *sysDate;
ShowLabel *temp;
ShowLabel *insideData;
ShowLabel *netTemp;
ShowLabel *weather;
ShowLabel *netData;
ShowLabel *updateTime;
QLabel *weatherIcon;
};
#endif // SHOWTODAY_H
实现文件
#include "showtoday.h"
ShowToday::ShowToday( QWidget *parent)
: QWidget( parent)
{
this->setMinimumSize(1024,600);
this->setMaximumSize(1024,600);
QDateTime time = QDateTime::currentDateTime();//获取系统现在的时间
sysDate = new ShowLabel(this);
sysDate->addFontSize(6);
sysDate->setAlignment(Qt::AlignHCenter);
sysDate->setGeometry(QRect(180,50,800,60));
sysDate->setText(time.toString("yyyy年M月d日 dddd"));
updateTime = new ShowLabel(this);
updateTime->addFontSize(4);
updateTime->setAlignment(Qt::AlignHCenter);
updateTime->setGeometry(QRect(180,100,800,60));
updateTime->setText(time.toString("yyyy年M月d日 dddd")+tr("更新"));
//℃
netTemp = new ShowLabel(this);
// netTemp->addFontSize(32);//arm
netTemp->addFontSize(50);//pc
// netTemp->setGeometry(QRect(370, 130, 200, 200));//arm
netTemp->setGeometry(QRect(400, 110, 200, 200));//pc
netTemp->setText(tr("7℃"));
weatherIcon = new QLabel(this);
weatherIcon->setGeometry(QRect(650, 170, 100, 90));
weatherIcon->setPixmap(QPixmap(":/images/weathercn02/0.png"));
weatherIcon->setScaledContents(true);
weather = new ShowLabel(this);
weather->addFontSize(10);
weather->setGeometry(QRect(210, 280, 800, 60));
weather->setAlignment(Qt::AlignHCenter);
weather->setText(tr("10:30更新 多云 2-9℃"));
//显示网络数据
netData = new ShowLabel(this);
netData->addFontSize(4);
netData->setGeometry(QRect(210, 365, 800, 60));
netData->setAlignment(Qt::AlignHCenter);
netData->setText(tr("湿度 87% 北风 2级 PM2.5 66 轻度污染"));
//显示室内数据
insideData = new ShowLabel(this);
insideData->addFontSize(6);
insideData->setGeometry(QRect(210, 460, 800, 60));
insideData->setAlignment(Qt::AlignHCenter);
insideData->setText(tr("室内 温度 4℃ 湿度 78% PM2.5 66"));
}
//室内数据更新
void ShowToday::setInsideVal(QString value){
insideData->setText(value);
}
//网络天气更新
void ShowToday::updateVal(QString *arr){
sysDate->setText(arr[1]+tr(" ")+arr[2]);
//更新时间
updateTime->setText(arr[11].mid(11)+tr("更新"));
//当前温度
netTemp->setText(arr[4]+tr("℃"));
//天气图标
weatherIcon->setPixmap(QPixmap(":/images/weathercn02/"+arr[7]+".png"));
//城市,天气情况
weather->setText(arr[0]+tr(" ")+arr[3]+tr(" ")+arr[5]+tr("-")+arr[6]+tr("℃"));
//显示湿度,风力,空气
netData->setText(tr("湿度 ")+arr[8]+tr(" ")+arr[9]+arr[10]+tr(" PM2.5 ")+arr[13] +tr(" ") + arr[14]);
}
设备模块初始化
在主界面程序中由DevInit(void)
int SysDialog::DevInit(void){
fd_pm25 = ::open(COM0,O_RDONLY);
if(fd_pm25 < 0){
info = "Can't Open Serial Port!";
info += COM0;
return -1;
}
init_com(fd_pm25);
info = "PM2.5 modules init OK.";
//dht11 init
if( (fd_dht = ::open(DEV_F_DHT,O_RDONLY)) < 0){
printf("dht11 init error...\n");
return -1;
}else{
printf("dht11 init...\n");
}
return 0;
}
室内更新显示
由主界面程序中的定时更新函数void SysDialog::updateSYS(void)实现
//pm2.5 update
bzero(buf,350);
if(read(fd_pm25,buf,350)>0){
pm = 0;
pm = da_pro(buf);
if(pm==-1)
info = "Err";
else
info = QString::number(pm);
}
get_dht_data();
value ="温度 " + QString::number(temp-3) + " 湿度 " + QString::number(humi) + QString(" PM2.5 ") + info;
showToday->setInsideVal(value);
网络天气更新
系统更新时机 1 . python程序执行从云端获取新的天气数据产生新的day_file文件后。2 .间隔300秒从day_file文件读取数据。
//day_file 示例
武汉$2017-04-05$星期三$小雨$15$15$20$7$98$北风$2级$2017-04-05 09:36:04$100$81$轻度污染$108$
//updateSYS函数中更新显示的数据
if(temp_timer>=300 || sysSet->getFlagVal()==1){
...
this->get_day_value();
showToday->updateVal(dayArr);
...
}
//从文件中解析数据
int SysDialog::get_day_value(void)
{
FILE *fp;
char read_buf[LEN];
char buf[LEN];
char key_buf[32];
char* p,*temp;
int i=0,j=0,len=0,key_ok=0,index=0;
bzero(read_buf,LEN);
fp = fopen(DAY_FILE,"r");
if(NULL == fp) return -1;
fread(read_buf,1,1024,fp);
printf("%s\n",read_buf);
p=read_buf;
bzero(buf,LEN);
len= strlen(read_buf);
printf("len=%d\n",len);
temp=buf;
for(i;i<len;i++){
if(p[i] != '$'){
*temp = p[i];
temp++;
}else{
*temp=0;
temp=buf;
dayArr[index]= QString(buf);
if(++index > 15)
index = 0;
}
}
return 0;
}