QT简单曲线图绘制(基于QChart)

17 篇文章 0 订阅

本例指定一系列离散点,可绘制曲线图,并可将图表嵌入QWidget中
效果如下:
在这里插入图片描述
本例曲线图绘制使用QT的QChart模块实现(QT5.7及其以上版本才有此功能),自行封装了Chart类,
调用如下:

.pro工程文件:

#-------------------------------------------------
#
# Project created by QtCreator 2020-08-12T20:05:22
#
#-------------------------------------------------

QT       += core gui
QT       += charts

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = QCharts_Test
TEMPLATE = app

DEFINES += QT_DEPRECATED_WARNINGS

SOURCES += \
        main.cpp \
        mainwindow.cpp \
    chart.cpp

HEADERS += \
        mainwindow.h \
    chart.h

FORMS += \
        mainwindow.ui

mainwindow.h文件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "chart.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    Chart *chart;
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void initChart();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp文件:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    initChart();
}

MainWindow::~MainWindow()
{
    delete ui;
}
//初始化图表
void MainWindow::initChart()
{
    //设置表头
    chart = new Chart(this,"历史数据");
    //设置坐标系
    chart->setAxis("X轴",0,100,11, "Y轴",0,20,11);
    //设置离散点数据
    QList<QPointF> pointlist = {QPointF(0,1), QPointF(10,2), QPointF(20,4), QPointF(30,8), QPointF(40,16), \
                                QPointF(50,16), QPointF(60,8), QPointF(70,4), QPointF(80,2), QPointF(90,1),};
    //绘制
    chart->buildChart(pointlist);
    //为MainWindow的centralWidget添加一个布局
    QHBoxLayout *pHLayout = new QHBoxLayout(ui->centralWidget);
    //将chart添加到布局中
    pHLayout->addWidget(chart);
}

最后是Chart类的实现:

chart.h

#ifndef CHART_H
#define CHART_H

#include <QChartView>
#include <QChart>
#include <QSplineSeries>
#include <QHBoxLayout>
#include <QValueAxis>

QT_CHARTS_USE_NAMESPACE
class Chart : public QWidget
{
    Q_OBJECT
    QChart *qchart;
    QChartView *chartview;
    QSplineSeries *series;

    QHBoxLayout *layout;
    QValueAxis *axisX;
    QValueAxis *axisY;

    QString chartname;
    //坐标轴参数
    QString xname;
    qreal xmin;
    qreal xmax;
    int xtickc;
    QString yname;
    qreal ymin;
    qreal ymax;
    int ytickc;

public:
    Chart(QWidget* parent = 0, QString _chartname = "曲线图");
    ~Chart(){}
    void setAxis(QString _xname, qreal _xmin, qreal _xmax, int _xtickc, \
                 QString _yname, qreal _ymin, qreal _ymax, int _ytickc);
    void buildChart(QList<QPointF> pointlist);

};
#endif // CHART_H

chart.cpp

#include "chart.h"

Chart::Chart(QWidget* parent, QString _chartname){
    setParent(parent);
    chartname = _chartname;
    series = new QSplineSeries(this);
    qchart = new QChart;
    chartview = new QChartView(qchart);
    layout = new QHBoxLayout(this);
    axisX = new QValueAxis(this);
    axisY = new QValueAxis(this);
    //在ui里面添加了一个Widget并把曲线图添加进去
    layout->addWidget(chartview);
    setLayout(layout);
    chartview->setRenderHint(QPainter::Antialiasing);//防止图形走样
}

void Chart::setAxis(QString _xname, qreal _xmin, qreal _xmax, int _xtickc, \
             QString _yname, qreal _ymin, qreal _ymax, int _ytickc){
    xname = _xname; xmin = _xmin; xmax = _xmax; xtickc = _xtickc;
    yname = _yname; ymin = _ymin; ymax = _ymax; ytickc = _ytickc;

    axisX->setRange(xmin, xmax);    //设置范围
    axisX->setLabelFormat("%u");   //设置刻度的格式
    /************************************
        %u 无符号十进制整数
        %s 字符串
        %c 一个字符
        %d 有符号十进制整数
        %e 浮点数、e-记数法
        %f 浮点数、十进制记数法
        %s 字符串
    ****************************************/
        axisX->setGridLineVisible(true);   //网格线可见
        axisX->setTickCount(xtickc);       //设置多少个大格
        axisX->setMinorTickCount(1);   //设置每个大格里面小刻度线的数目
        axisX->setTitleText(xname);  //设置描述
        axisY->setRange(ymin, ymax);
        axisY->setLabelFormat("%u");
        axisY->setGridLineVisible(true);
        axisY->setTickCount(ytickc);
        axisY->setMinorTickCount(1);
        axisY->setTitleText(yname);
        qchart->addAxis(axisX, Qt::AlignBottom); //下:Qt::AlignBottom  上:Qt::AlignTop
        qchart->addAxis(axisY, Qt::AlignLeft);   //左:Qt::AlignLeft    右:Qt::AlignRight
}

void Chart::buildChart(QList<QPointF> pointlist)
{
    //创建数据源
    series->setPen(QPen(Qt::blue,3,Qt::SolidLine));
    series->clear();
    for(int i=0; i<pointlist.size();i++)
        series->append(pointlist.at(i).x(), pointlist.at(i).y());

    qchart->setTitle(chartname);
    qchart->setAnimationOptions(QChart::SeriesAnimations);//设置曲线动画模式
    qchart->legend()->hide(); //隐藏图例
    qchart->addSeries(series);//输入数据
    qchart->setAxisX(axisX, series);
    qchart->setAxisY(axisY, series);
}

  • 23
    点赞
  • 282
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答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的绘图功能,我们可以更加方便地创建出漂亮的曲线图

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值