Scatter Interactions Example▲
Sélectionnez
/**
**************************************************************************
**
** 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()-&
gt;setTitle("Click to interact with scatter points"
);
m_scatter =
new
QScatterSeries();
m_scatter-&
gt;setName("scatter1"
);
for
(qreal x(0.5
); x &
lt;=
4.0
; x +=
0.5
) {
for
(qreal y(0.5
); y &
lt;=
4.0
; y +=
0.5
)
*
m_scatter &
lt;&
lt; QPointF(x, y);
}
m_scatter2 =
new
QScatterSeries();
m_scatter2-&
gt;setName("scatter2"
);
chart()-&
gt;addSeries(m_scatter2);
chart()-&
gt;addSeries(m_scatter);
chart()-&
gt;createDefaultAxes();
chart()-&
gt;axes(Qt::
Horizontal).first()-&
gt;setRange(0
, 4.5
);
chart()-&
gt;axes(Qt::
Vertical).first()-&
gt;setRange(0
, 4.5
);
connect(m_scatter, &
amp;QScatterSeries::
clicked, this
, &
amp;ChartView::
handleClickedPoint);
}
ChartView::
~
ChartView()
{
}
void
ChartView::
handleClickedPoint(const
QPointF &
amp;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-&
gt;points();
for
(const
QPointF &
amp;currentPoint : points) {
qreal currentDistance =
qSqrt((currentPoint.x() -
clickedPoint.x())
*
(currentPoint.x() -
clickedPoint.x())
+
(currentPoint.y() -
clickedPoint.y())
*
(currentPoint.y() -
clickedPoint.y()));
if
(currentDistance &
lt; distance) {
distance =
currentDistance;
closest =
currentPoint;
}
}
// Remove the closes point from series 1 and append it to series 2
m_scatter-&
gt;remove(closest);
m_scatter2-&
gt;append(closest);
}