当前位置: 首页 > 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天气预报系统完成!

相关文章:

  • 专业课复习笔记 4
  • 基于Python+MongoDB猫眼电影 Top100 数据爬取与存储
  • 地埋式燃气泄漏检测装置与地下井室可燃气体检测装置有什么区别
  • LLM(17):计算所有输入 token 的注意力权重
  • 【动态规划】子序列问题
  • Java 企业级开发设计模式全解析
  • 用户模块 - IP归属地功能实现与测试
  • AI Agent开发第50课-机器学习的基础-线性回归如何应用在商业场景中
  • PyTorch_自动微分模块
  • linux tar命令详解。压缩格式对比
  • C++访问MySQL
  • 联邦学习的深度解析,有望打破数据孤岛
  • 3.5/Q1,GBD数据库最新一区文章解读
  • rollout 是什么:机器学习(强化学习)领域
  • 【C/C++】各种概念联系及辨析
  • Socket 编程 TCP
  • 2025年PMP 学习五
  • Qt天气预报系统更新UI界面
  • 电路研究9.3.3——合宙Air780EP中的AT开发指南:HTTP(S)-HTTP GET 示例
  • 逆向常见题目—迷宫类题目
  • 十大券商看后市|A股风险偏好有回升空间,把握做多窗口
  • 联合国秘书长古特雷斯呼吁印巴保持最大克制
  • 准80后遵义市自然资源局局长陈清松任仁怀市委副书记、代市长
  • 2024年境内酒店住宿行业指标同比下滑:酒店行业传统增长模式面临挑战
  • 巴菲特股东大会前瞻:执掌伯克希尔60年,巨轮将驶向何方
  • 建设银行南昌分行引金融“活水”,精准灌溉乡村沃土