当前位置: 首页 > news >正文

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天气预报系统完成!
http://www.xdnf.cn/news/291115.html

相关文章:

  • 2048游戏(含Python源码)
  • 【计算机视觉】3d人体重建:PIFu/PIFuHD:高精度三维人体数字化技术指南
  • [逆向工程]什么是“暗桩”
  • 【Java学习笔记】包
  • Redis ZSet 实现原理与跳表选择原因
  • Lombok 是什么?
  • Python字符串全解析:从基础操作到高级应用的技术指南
  • 36-校园反诈系统(小程序)
  • K8S node ARP 表爆满 如何优化
  • 【深度学习-Day 6】掌握 NumPy:ndarray 创建、索引、运算与性能优化指南
  • git上常用的12个月份对应的英语单词以及月份英语缩写形式
  • [machine learning] Transformer - Attention (三)
  • C++ 检查某个点是否存在于圆扇区内(Check whether a point exists in circle sector or not)
  • 2025流感疫苗指南+卫健委诊疗方案|高危人群防护+并发症处理 慢性肾脏病饮食指南2025卫健委版|低盐低磷食谱+中医调理+PDF 网盘下载 pdf下载
  • Scala day6(Class,field,Single Object)
  • EPSG:3857 和 EPSG:4326 的区别
  • 掌纹图像识别:解锁人类掌纹/生物识别的未来——技术解析与前沿数据集探索
  • 2025系统架构师---论软件的设计模式论文
  • Java按字节长度截取字符串指南
  • JVM——Java对象的内存布局
  • Hive安装与配置教程
  • 详讲viewer查看器
  • Astro Canvas 数据中心→设备一览大屏操作指南
  • 基于 HTML5 的贪吃蛇小游戏实现
  • Oracle数据库从入门到掌握基础应用能力
  • 16. Qt系统相关:事件、定时器
  • 金融的本质是智融、融资的实质是融智、投资的关键是投智,颠覆传统金融学的物质资本中心论,构建了以智力资本为核心的新范式
  • 启发式算法-禁忌搜索算法
  • Python学习之路(七)-绘画and动画
  • 使用 JavaScript 实现数据导出为 Excel 和 CSV 文件