chartview.cpp Example File | Qt Charts 5.12.9

- Qt 5.12
- Qt Charts
- Scatter Interactions Example
- chartview.cpp Example File
- Qt Charts | Commercial or GPLv3

# chartview.cpp Example File

scatterinteractions/chartview.cpp

     /****************************************************************************
     **
     ** Copyright (C) 2016 The Qt Company Ltd.
     ** Contact: https://www.qt.io/licensing/
     **
     ** This file is part of the Qt Charts module of the Qt Toolkit.
     **
     ** $QT_BEGIN_LICENSE:GPL$
     ** Commercial License Usage
     ** Licensees holding valid commercial Qt licenses may use this file in
     ** accordance with the commercial license agreement provided with the
     ** Software or, alternatively, in accordance with the terms contained in
     ** a written agreement between you and The Qt Company. For licensing terms
     ** and conditions see https://www.qt.io/terms-conditions. For further
     ** information use the contact form at https://www.qt.io/contact-us.
     **
     ** GNU General Public License Usage
     ** Alternatively, this file may be used under the terms of the GNU
     ** General Public License version 3 or (at your option) any later version
     ** approved by the KDE Free Qt Foundation. The licenses are as published by
     ** the Free Software Foundation and appearing in the file LICENSE.GPL3
     ** included in the packaging of this file. Please review the following
     ** information to ensure the GNU General Public License requirements will
     ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
     **
     ** $QT_END_LICENSE$
     **
     ****************************************************************************/

     #include "chartview.h"
     #include <QtCore/QtMath>
     #include <QtCore/QDebug>

     QT_CHARTS_USE_NAMESPACE

     ChartView::ChartView(QWidget *parent)
         : QChartView(new QChart(), parent),
           m_scatter(0),
           m_scatter2(0)
     {
         setRenderHint(QPainter::Antialiasing);

         chart()->setTitle("Click to interact with scatter points");

         m_scatter = new QScatterSeries();
         m_scatter->setName("scatter1");
         for (qreal x(0.5); x <= 4.0; x += 0.5) {
             for (qreal y(0.5); y <= 4.0; y += 0.5)
                 *m_scatter << QPointF(x, y);
         }
         m_scatter2 = new QScatterSeries();
         m_scatter2->setName("scatter2");

         chart()->addSeries(m_scatter2);
         chart()->addSeries(m_scatter);
         chart()->createDefaultAxes();
         chart()->axes(Qt::Horizontal).first()->setRange(0, 4.5);
         chart()->axes(Qt::Vertical).first()->setRange(0, 4.5);

         connect(m_scatter, &QScatterSeries::clicked, this, &ChartView::handleClickedPoint);
     }

     ChartView::~ChartView()
     {
     }

     void ChartView::handleClickedPoint(const QPointF &point)
     {
         QPointF clickedPoint = point;
         // Find the closest point from series 1
         QPointF closest(INT_MAX, INT_MAX);
         qreal distance(INT_MAX);
         const auto points = m_scatter->points();
         for (const QPointF &currentPoint : points) {
             qreal currentDistance = qSqrt((currentPoint.x() - clickedPoint.x())
                                           * (currentPoint.x() - clickedPoint.x())
                                           + (currentPoint.y() - clickedPoint.y())
                                           * (currentPoint.y() - clickedPoint.y()));
             if (currentDistance < distance) {
                 distance = currentDistance;
                 closest = currentPoint;
             }
         }

         // Remove the closes point from series 1 and append it to series 2
         m_scatter->remove(closest);
         m_scatter2->append(closest);
     }