Qt天气预报系统绘制温度曲线

绘制温度曲线

1、安装事件过滤器

cpp 复制代码
//给标签添加事件过滤器
ui->higntTemLabel->installEventFilter(this);        //高温事件过滤器
ui->lowTemLabel->installEventFilter(this);          //低温事件过滤器

2、实现事件过滤器

cpp 复制代码
//事件过滤
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、定义一些常量

cpp 复制代码
#define INCREMENT 3         //温度升高或降低y轴增量
#define POINT_RADIUS 3      //绘制温度曲线点的半径

#define OFFSET_X 19  //离温度曲线平均值的x坐标
#define OFFSET_Y 12  //离温度曲线平均值的x坐标

4、绘制高温曲线

cpp 复制代码
//绘制高温曲线
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、绘制低温曲线

cpp 复制代码
//绘制低温曲线
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函数里更新事件

cpp 复制代码
//不添加温度就会显示为0℃
ui->higntTemLabel->update();
ui->lowTemLabel->update();

7、代码仓库地址

仓库地址

8、总结

|--------------------------------------------------------------------------------------------------|
| 以上就是Qt天气预报系统实现的整个过程了,浏览过程中,如若发现错误,欢迎大家指正,有问题的欢迎评论区留言或者私信。最后,如果大家觉得有所帮助,可以点一下赞,谢谢大家!祝大家天天开心,顺遂无虞! |

Qt天气预报系统完成!

相关推荐
zl21878654489 小时前
Playwright同步、异步、并行、串行执行效率比较
开发语言·python·测试工具
Larry_Yanan9 小时前
QML学习笔记(十七)QML的属性变更信号
javascript·c++·笔记·qt·学习·ui
Tony Bai9 小时前
【Go开发者的数据库设计之道】05 落地篇:Go 语言四种数据访问方案深度对比
开发语言·数据库·后端·golang
gopyer9 小时前
180课时吃透Go语言游戏后端开发3:Go语言中其他常用的数据类型
开发语言·游戏·golang·游戏后端开发
come112349 小时前
Go vs. PHP:核心优势劣势对比
开发语言·golang·php
eqwaak010 小时前
Flask实战指南:从基础到高阶的完整开发流程
开发语言·后端·python·学习·flask
默|笙10 小时前
【c++】红黑树的部分实现
开发语言·c++
轩情吖11 小时前
Qt常用控件之QSpinBox
开发语言·c++·qt·控件·桌面级开发·qspinbox·微调框
掘根11 小时前
【Qt】输入类控件2——SpinBox,DateEdit,TimeEdit,Dial,Slider
开发语言·qt
wshzrf11 小时前
【Java系列课程·Java学前须知】第3课 JDK,JVM,JRE的区别和优缺
java·开发语言·jvm