Qt天气预报系统绘制温度曲线
绘制温度曲线
- 1、安装事件过滤器
- 2、实现事件过滤器
- 3、定义一些常量
- 4、绘制高温曲线
- 5、绘制低温曲线
- 6、在UI函数里更新事件
- 7、代码仓库地址
- 8、总结
1、安装事件过滤器
//给标签添加事件过滤器
ui->higntTemLabel->installEventFilter(this); //高温事件过滤器
ui->lowTemLabel->installEventFilter(this); //低温事件过滤器
2、实现事件过滤器
//事件过滤
bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{if(event->type() == QEvent::Paint){//"watched" 是否等于 "ui->higntTemLabel",来判断是否是标签控件 "ui->higntTemLabel" 的绘图事件if(watched == ui->higntTemLabel){paintHightTemCure(); //绘制高温}if(watched == ui->lowTemLabel){paintLowTemCure(); //绘制低温}}return QWidget::eventFilter(watched,event);}
3、定义一些常量
#define INCREMENT 3 //温度升高或降低y轴增量
#define POINT_RADIUS 3 //绘制温度曲线点的半径#define OFFSET_X 19 //离温度曲线平均值的x坐标
#define OFFSET_Y 12 //离温度曲线平均值的x坐标
4、绘制高温曲线
//绘制高温曲线
void MainWindow::paintHightTemCure()
{QPainter painter(ui->higntTemLabel); // 创建一个QPainter对象,将ui->higntTemLabel作为绘图设备//抗锯齿painter.setRenderHint(QPainter::Antialiasing,true);//1、获取x坐标int pointX[7] = {0}; //定义一个数组存储温度x坐标//遍历7个点for(int i=0; i<7;i++){pointX[i] = windDirectionList[i]->pos().x() + windDirectionList[i]->width()/2;;}//获取y坐标int tempSum = 0; //高温总和int tempAverage = 0; //高温平均值for(int i=0; i<7; i++){tempSum += day[i].highTem; //7天高温值的总和}tempAverage = tempSum/7; //7天温度平均值//计算Y坐标int pointY[7] = {0}; //7个y点坐标int centerY = ui->higntTemLabel->height()/2; //高温标签y的中心坐标for(int i=0; i<7; i++){pointY[i] = centerY - ((day[i].highTem-tempAverage)*INCREMENT); //获得7个点y坐标}//开始绘制//初始化画笔QPen pen = painter.pen(); //获得画笔pen.setWidth(1); //画笔宽度pen.setColor(QColor(45,224,217)); //设置画笔颜色painter.setPen(pen); //设置画笔painter.setBrush(QColor(45,224,217)); //设置画刷,内部填充颜色//画点,画文本for(int i=0; i<7; i++){painter.drawEllipse(QPoint(pointX[i],pointY[i]), POINT_RADIUS,POINT_RADIUS); //画7个点的圆圈//显示文本painter.drawText(pointX[i]-OFFSET_X,pointY[i]-OFFSET_Y,QString::number(day[i].highTem) + "℃");}//绘制曲线for(int i=0; i < 6; i++){if(i==0){pen.setStyle(Qt::DotLine); //画虚线painter.setPen(pen); //设置画笔}else{pen.setStyle(Qt::SolidLine); //画实线painter.setPen(pen); //设置画笔}painter.drawLine(pointX[i],pointY[i],pointX[i+1],pointY[i+1]); //画7天的线}
}
5、绘制低温曲线
//绘制低温曲线
void MainWindow::paintLowTemCure()
{QPainter painter(ui->lowTemLabel); // 创建一个QPainter对象,将ui->higntTemLabel作为绘图设备//抗锯齿painter.setRenderHint(QPainter::Antialiasing,true);//1、获取x坐标int pointX[7] = {0}; //定义一个数组存储温度x坐标//遍历7个点for(int i=0; i<7;i++){pointX[i] = windDirectionList[i]->pos().x() + windDirectionList[i]->width()/2;;}//获取y坐标int tempSum = 0; //高温总和int tempAverage = 0; //高温平均值for(int i=0; i<7; i++){tempSum += day[i].lowTem; //7天高温值的总和}tempAverage = tempSum/7; //7天温度平均值//计算Y坐标int pointY[7] = {0}; //7个y点坐标int centerY = ui->lowTemLabel->height()/2; //高温标签y的中心坐标for(int i=0; i<7; i++){pointY[i] = centerY - ((day[i].lowTem-tempAverage)*INCREMENT); //获得7个点y坐标}//开始绘制//初始化画笔QPen pen = painter.pen(); //获得画笔pen.setWidth(1); //画笔宽度pen.setColor(QColor(255,223,0)); //设置画笔颜色painter.setPen(pen); //设置画笔painter.setBrush(QColor(255,223,0)); //设置画刷,内部填充颜色//画点,画文本for(int i=0; i<7; i++){painter.drawEllipse(QPoint(pointX[i],pointY[i]), POINT_RADIUS,POINT_RADIUS); //画7个点的圆圈// qDebug() << day[i].lowTem;//显示文本painter.drawText(pointX[i]-OFFSET_X,pointY[i]-OFFSET_Y,QString::number(day[i].lowTem) + "℃");}//绘制曲线for(int i=0; i < 6; i++){if(i==0){pen.setStyle(Qt::DotLine); //画虚线painter.setPen(pen); //设置画笔}else{pen.setStyle(Qt::SolidLine); //画实线painter.setPen(pen); //设置画笔}painter.drawLine(pointX[i],pointY[i],pointX[i+1],pointY[i+1]); //画7天的线}}
6、在UI函数里更新事件
//不添加温度就会显示为0℃
ui->higntTemLabel->update();
ui->lowTemLabel->update();
7、代码仓库地址
仓库地址
8、总结
以上就是Qt天气预报系统实现的整个过程了,浏览过程中,如若发现错误,欢迎大家指正,有问题的欢迎评论区留言或者私信。最后,如果大家觉得有所帮助,可以点一下赞,谢谢大家!祝大家天天开心,顺遂无虞! |
Qt天气预报系统完成!