美文网首页
QtCharts绘图

QtCharts绘图

作者: AD_wang | 来源:发表于2023-06-20 15:55 被阅读0次

    .H

    #ifndef GAI_CHART_VIEW_H

    #define GAI_CHART_VIEW_H

    #include <QtCharts/QChartView>

    #include <QtCharts/QSplineSeries>

    #include <QtCharts/QLineSeries>

    #include <QtCharts/QBarSeries>

    #include <QtCharts/QValueAxis>

    #include <QtCharts/QChart>

    #include <QtCharts/QBarSet>

    using namespace QtCharts;

    class GaiChartView : public QChartView

    {

    Q_OBJECT

    public:

    GaiChartView(QWidget *parent);

    ~GaiChartView();

    public:

    //画曲线图X-Y,vvData[0]为横坐标数据,其他为纵轴数据

    void DrawCurve(QVector<QVector<double> > &vvData, QStringList &lstLegends, QString strXLabel ="", QString strYLabel ="",QString strViewLabel ="");

    //画曲线图X-Y,vvData[奇数]为横坐标数据,vvData[奇数+1]纵轴数据

    void DrawCurve_ave(QVector<QVector<double> > &vvData, QString strViewLabel ="", QString strXLabel ="", QString strYLabel ="");

    //绘制简单的直方图

    void DrawBar(QVector<double> &vData);

    public slots:

    //xianshi

    void DisplaySeriesValue(const QPointF &point, bool state);

    private:

    QChart *m_chart;

    };

    #endif // GAI_CHART_VIEW_H

    .cpp

    #include "gai_chart_view.h"

    #include <QGraphicsLayout>

    #include <QToolTip>

    GaiChartView::GaiChartView(QWidget *parent)

    : QChartView(parent)

    {

    m_chart = new QChart();

    QLineSeries *ptrSplineSeries = new QLineSeries();//曲线图

    *ptrSplineSeries << QPointF(0.0, 0.0) << QPointF(3.0, 0.0);

    m_chart->addSeries(ptrSplineSeries);

    m_chart->createDefaultAxes();

    //设置以下属性使显示区域最大化

    m_chart->layout()->setContentsMargins(1, 1, 1, 1);//设置外边界全部为1

    m_chart->setMargins(QMargins(1, 1, 1, 1));//设置内边界全部为1

    m_chart->setBackgroundRoundness(0); //设置背景区域无圆角

    setChart(m_chart);

    }

    GaiChartView::~GaiChartView()

    {

    }

    void GaiChartView::DrawCurve(QVector<QVector<double> > &vvData, QStringList &lstLegends, QString strXLabel /*=""*/, QString strYLabel /*=""*/, QString strViewLabel /*=""*/)

    {

    if (vvData.isEmpty() || vvData.size() - 1 != lstLegends.size())

    {

    return ;

    }

    m_chart->removeAllSeries();

    QVector<QSplineSeries *> vecSplineSeries;

    QVector<double> &vRow0 = vvData[0];

    for (int i = 1; i < vvData.size(); ++i)

    {

    QSplineSeries *ptrSplineSeries = new QSplineSeries();//曲线图

    QVector<double> &vRow = vvData[i];

    for (int j = 0; j < vRow.size(); ++j)

    {

    *ptrSplineSeries << QPointF(vRow0[j], vRow[j]);

    }

    vecSplineSeries.push_back(ptrSplineSeries);

    }

    for (int i = 0; i < vecSplineSeries.size(); ++i)

    {

    QString strName = lstLegends[i];

    vecSplineSeries[i]->setName(strName);

    m_chart->addSeries(vecSplineSeries[i]);

    connect(vecSplineSeries[i], SIGNAL(hovered(const QPointF&, bool)), this, SLOT(DisplaySeriesValue(const QPointF &, bool)));

    }

    auto xMax = std::max_element(std::begin(vvData[0]), std::end(vvData[0]));

    auto xMin = std::min_element(std::begin(vvData[0]), std::end(vvData[0]));

    double xLow = *xMin;

    double xHigh = *xMax;

    double yLow  = DBL_MAX;

    double yHigh = DBL_MIN;

    for (int i = 1; i < vvData.size(); ++i)

    {

    auto yMax = std::max_element(std::begin(vvData[i]), std::end(vvData[i]));

    auto yMin = std::min_element(std::begin(vvData[i]), std::end(vvData[i]));

    if (*yMax > yHigh)

    {

    yHigh = *yMax;

    }

    if (*yMin < yLow)

    {

    yLow = *yMin;

    }

    }

    QValueAxis *axisX = dynamic_cast<QValueAxis *>(m_chart->axisX());

    axisX->setRange(xLow, xHigh);

    axisX->setTitleText("");

    if (!strXLabel.isEmpty())

    {

    axisX->setTitleText(strXLabel);

    }

    QValueAxis *axisY = dynamic_cast<QValueAxis *>(m_chart->axisY());

    axisY->setRange(yLow, yHigh);

    axisY->setTitleText("");

    if (!strYLabel.isEmpty())

    {

    axisY->setTitleText(strYLabel);

    }

    //曲线和坐标绑定,否则会出现数据和坐标对应不上的情况

    for (int i = 0; i < vecSplineSeries.size(); ++i)

    {

    vecSplineSeries[i]->attachAxis(axisX);

    vecSplineSeries[i]->attachAxis(axisY);

    }

    m_chart->setTitle("");

    if (!strViewLabel.isEmpty())

    {

    m_chart->setTitle(strViewLabel);

    }

    }

    void GaiChartView::DrawCurve_ave(QVector<QVector<double> > &vvData, QString strViewLabel /*=""*/, QString strXLabel /*=""*/, QString strYLabel /*=""*/)

    {

    if (vvData.isEmpty())

    {

    return ;

    }

    m_chart->removeAllSeries();

    QVector<QSplineSeries *> vecSplineSeries;

    for (int i = 0; i < vvData.size(); i += 2)

    {

    QSplineSeries *ptrSplineSeries = new QSplineSeries();//曲线图

    QVector<double> &vRowX = vvData[i];

    QVector<double> &vRowY = vvData[i+1];

    for (int j = 0; j < vRowX.size(); ++j)

    {

    *ptrSplineSeries << QPointF(vRowX[j], vRowY[j]);

    }

    vecSplineSeries.push_back(ptrSplineSeries);

    }

    for (int i = 0; i < vecSplineSeries.size(); ++i)

    {

    m_chart->addSeries(vecSplineSeries[i]);

    connect(vecSplineSeries[i], SIGNAL(hovered(const QPointF&, bool)), this, SLOT(DisplaySeriesValue(const QPointF &, bool)));

    }

    double xLow = DBL_MAX;

    double xHigh = DBL_MIN;

    for (int i = 0; i < vvData.size(); i += 2)

    {

    auto xMax = std::max_element(std::begin(vvData[i]), std::end(vvData[i]));

    auto xMin = std::min_element(std::begin(vvData[i]), std::end(vvData[i]));

    if (*xMax > xHigh)

    {

    xHigh = *xMax;

    }

    if (*xMin < xLow)

    {

    xLow = *xMin;

    }

    }

    double yLow  = DBL_MAX;

    double yHigh = DBL_MIN;

    for (int i = 1; i < vvData.size(); i += 2)

    {

    auto yMax = std::max_element(std::begin(vvData[i]), std::end(vvData[i]));

    auto yMin = std::min_element(std::begin(vvData[i]), std::end(vvData[i]));

    if (*yMax > yHigh)

    {

    yHigh = *yMax;

    }

    if (*yMin < yLow)

    {

    yLow = *yMin;

    }

    }

    QValueAxis *axisX = dynamic_cast<QValueAxis *>(m_chart->axisX());

    axisX->setRange(xLow, xHigh);

    axisX->setTitleText("");

    if (!strXLabel.isEmpty())

    {

    axisX->setTitleText(strXLabel);

    }

    QValueAxis *axisY = dynamic_cast<QValueAxis *>(m_chart->axisY());

    axisY->setRange(yLow, yHigh);

    axisY->setTitleText("");

    if (!strYLabel.isEmpty())

    {

    axisY->setTitleText(strYLabel);

    }

    //曲线和坐标绑定,否则会出现数据和坐标对应不上的情况

    for (int i = 0; i < vecSplineSeries.size(); ++i)

    {

    vecSplineSeries[i]->attachAxis(axisX);

    vecSplineSeries[i]->attachAxis(axisY);

    }

    m_chart->setTitle("");

    if (!strViewLabel.isEmpty())

    {

    m_chart->setTitle(strViewLabel);

    }

    }

    void GaiChartView::DrawBar(QVector<double> &vData)

    {

    if (vData.isEmpty())

    {

    return ;

    }

    m_chart->removeAllSeries();

    QBarSet *pBarSet = new QBarSet("");

    pBarSet->append(vData.toList());

    QValueAxis *axisX = dynamic_cast<QValueAxis *>(m_chart->axisX());

    axisX->setRange(0, vData.size());

    auto yMax = std::max_element(std::begin(vData), std::end(vData));

    auto yMin = std::min_element(std::begin(vData), std::end(vData));

    double yLow  = *yMin;

    double yHigh = *yMax;

    QValueAxis *axisY = dynamic_cast<QValueAxis *>(m_chart->axisY());

    axisY->setRange(yLow, yHigh);

    QBarSeries *pBarSeries = new QBarSeries();

    pBarSeries->append(pBarSet);

    m_chart->addSeries(pBarSeries);

    pBarSeries->attachAxis(axisY);

    }

    void GaiChartView::DisplaySeriesValue(const QPointF &point, bool state)

    {

    if (state)

    {

    QToolTip::showText(QCursor::pos(),QString::asprintf("(%g,%g)", point.x(), point.y()),this,this->rect(),5000);

    }

    else

    {

    QToolTip::hideText();

    }

    }

    相关文章

      网友评论

          本文标题:QtCharts绘图

          本文链接:https://www.haomeiwen.com/subject/ubgyydtx.html