qt QWidget绘制曲线图表 (类似QChart)

最近不忙,所以自己用QWidget 绘制一个图表。

主要功能: 

        1. 一次可添加多条线,每条颜色都不一样

        2. 线条做了平滑处理(QPainterPath::cubicTo)   

        3. 点击线条后,线条加粗并显示每个数据坐标

        4. 点击线条上的小点, 可以用 鼠标、键盘 移动位置,在右侧会显示点的坐标值

        5. 修改右侧坐标值,线条中的点也会随之移动

        6. 鼠标右键可以删除线条

        7. 点击顶部颜色框会隐藏对应的线条

        8. 鼠标右键点击顶部颜色框,可以删除对应线条

        9. 将QWidget 存为图片

 几点总结:

1. 用绘制路径(QPainterPath)绘制多条线条时, 他们的内部会填充颜色,解决方法是将填充变成无:  painter.setBrush(Qt::NoBrush);      同理, 绘制图形不要边框也可以将pen 设置为 :  painter.setPen(Qt::NoPen);

2. 线条平滑处理

        // 转换坐标值
        QList<QPointF> drawPoint = conversionCoordinates(eachLine.vecPoint);

        // 计算绘制路径,做平滑处理(方法二)
        // 3次贝塞尔曲线
        drawPath.clear();
        drawPath.moveTo(drawPoint[0]);
        for (int i = 0; i < eachLine.drawPoint.count() - 1; i++)
        {
            QPointF sp = drawPoint[i];
            QPointF ep = drawPoint[i + 1];
            QPointF c1 = QPointF((sp.x() + ep.x()) * 0.5, sp.y());
            QPointF c2 = QPointF((sp.x() + ep.x()) * 0.5, ep.y());
            drawPath.cubicTo(c1,c2,ep);
        }

        // 路径绘制     
        painter.drawPath(drawPath);

3. 条线点击选择判断 

用  QPainterPathStroker  将路径加宽,增大选择区域, 通过 contains 判断点是否在路径中。

// 特别要注意笔宽度(其他图形类似于边框宽度)
QPainterPathStroker painterPathStroker; 
 
// 加大路径选择面积
painterPathStroker.setWidth(15);

// 生成加宽后的路径
QPainterPath newPath = painterPathStroker.createStroke(drawPath);

if(newPath.contains(event->pos()))
{
       // 线条被点击
}

4. 判断线条那个点被点击

先查找数据中,那个两个数据的X值与点击点的x值接近, 然后用两点距离公式计算距离,判断哪个点被点击。(我自己写了个二分法查找,因为我的数据是QPointF,没法用现成函数)

int MyDrawWidget::my_lower_bound(QList<QPointF> &drawPoint, qreal mouse_x)
{
    int count = drawPoint.length();
    int step = 0;
    int index = 0;

    while (count>0) {
        step = count / 2;

        if (drawPoint[step + index].x() < mouse_x)
        {
            count -= step + 1;
            index += step + 1;
        }
        else
        {
            count=step;
        }
    }

    qDebug() << index;

    return index;
}

5. 图表四边最好用四个常量,写起来麻烦,最后调整方便

6. 顶部的颜色块是 (QPushButton)

 我重写了这个控件,用来控制背景颜色和大小, 只用到了  paintEvent 和  mousePressEvent, 点击事件自己写了个信号,在 mousePressEvent触发。

7. QWidget 保存图片

    QString fileName = QFileDialog::getSaveFileName(this,"保存图片","C:\\Users\\Administrator\\Desktop\\程序测试图片.jpg","*.jpg");

    QPixmap map = QPixmap::grabWidget(ui->my_DrawWidget);
    map.save(fileName,"jpg");
}

结语:

   写完这个后,发现自己对 绘制、选择、控件自定义、信号槽、代码架构设计等有了更多理解。眼过千遍不如手过一遍,代码是敲出来的,自己的路是自己走出来的!!!

### 回答1: 在C++和Qt中,绘制曲线图可以使用Qt中的QCustomPlot库来实现。QCustomPlot是一个强大的绘图库,提供了丰富的绘图功能,包括曲线图、柱状图、散点图等。 要绘制曲线图,首先需要创建一个QCustomPlot对象,并将其添加到QWidget或QMainWindow上。然后,我们可以使用QCustomPlot的函数来设置图的标题、坐标轴标签和范围等属性。 接下来,可以创建一个QCPGraph对象,用于绘制曲线。通过设置QCPGraph的数据和颜色等属性,可以完成曲线的绘制。我们可以使用QCustomPlot的函数来添加和删除曲线。 在绘制曲线之前,需要准备好曲线的数据。通常,我们可以将曲线的数据存储在一个Qt容器(如QVector)中,然后将其传递给QCPGraph的setData函数。 一旦准备好曲线的数据和属性,即可调用QCustomPlot的replot函数来重新绘制曲线图曲线图会根据传递给setData函数的数据自动更新和调整。 除了基本的曲线绘制外,QCustomPlot还提供了许多其他功能,如坐标轴刻度的设置、网格线的显示、多曲线的绘制等。通过研究QCustomPlot的文档和示例代码,可以更深入地了解和使用它的功能。 总之,使用C++和Qt绘制曲线图是相对简单的。通过使用QCustomPlot库,我们可以方便地实现曲线的绘制和操控。 ### 回答2: 在C++中使用Qt绘制曲线图可以通过QCustomPlot库来实现。以下是实现步骤: 1. 安装QCustomPlot库:将QCustomPlot的源代码添加到项目中,并在项目文件的.pro文件中添加库的引用。 2. 创建曲线图窗口:使用QMainWindow或QWidget派生类创建一个窗口用于显示曲线图。 3. 初始化曲线图:在窗口的构造函数中,创建一个QCustomPlot对象,并设置图的标题、坐标轴等属性。 4. 添加数据:使用QVector保存曲线图的数据点,并将其添加到QCustomPlot对象中。 5. 绘制曲线图:使用QCustomPlot的addGraph()方法创建曲线,并将数据点设置为曲线的坐标。 6. 设置曲线样式:使用QPen类设置曲线的颜色、线型等样式。 7. 显示曲线图:使用QCustomPlot的replot()方法将曲线图绘制在窗口上。 8. 添加交互功能:如果需要,可以通过QCustomPlot的信号和槽机制,实现交互功能,例如缩放、平移等。 9. 更新曲线图:如果需要在运行期间更新曲线图,可以通过重新设置数据点的方式,再次调用replot()方法进行更新。 10. 清除曲线图:如果需要清除曲线图,可以调用QCustomPlot的clearGraphs()方法清除所有曲线。 总结:使用Qt的QCustomPlot库可以方便地绘制曲线图。通过初始化、添加数据、绘制曲线、设置样式、显示曲线、添加交互功能、更新和清除曲线等步骤,可以实现自定义的曲线图绘制。 ### 回答3: C++和Qt是一种常用的编程语言和开发工具,可以用于绘制曲线图Qt是一个跨平台的开发框架,具有丰富的功能和易用的API,可以轻松地绘制各种图形,包括曲线图。 要使用Qt绘制曲线图,首先需要创建一个窗口或视图来展示图形。可以使用Qt的窗口类(如QMainWindow、QWidget)或图形视图类(如QGraphicsView、QChartView)来创建一个可显示图形的界面。 然后,需要创建一个曲线图对象(如QLineSeries、QSplineSeries),并且添加数据点到曲线上。Qt提供了数据序列类来存储数据,以便绘制曲线图。可以使用append方法向序列对象中添加数据点。 接下来,需要创建一个图对象(如QChart),将曲线图对象添加到图中,并设置图的样式和属性,如标题、坐标轴等。Qt提供了一系列的图类,来帮助我们创建具有各种样式的图。 最后,将图对象添加到窗口或视图中,并显示出来。可以使用布局管理器(如QVBoxLayout、QGridLayout)将图放置在窗口或视图中的合适位置,然后调用show()方法显示出来。 在绘制曲线图时,还可以根据需要自定义曲线的样式和属性,如线条颜色、线宽等。可以使用Qt的绘图API来绘制曲线,如设置笔(QPen)的颜色和宽度。 绘制曲线图是一个需要一定编程知识和经验的任务,但使用Qt可以简化这个过程,提供了丰富的功能和易用的API,使曲线图绘制变得容易和灵活。通过学习和熟悉Qt的绘图功能,我们可以更加方便地创建出漂亮的曲线图
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值