注意:必须使用命名空间:QT_CHARTS_USE_NAMESPACE
如图:
代码:
#include <QApplication>
#include <QMainWindow>
#include <QChartView>
#include <QChart>
#include <QScatterSeries>
#include <QPainter>
#include <QtMath>
#include <QImage>
#include <QObject>
QT_CHARTS_USE_NAMESPACE
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QScatterSeries *series1 = new QScatterSeries();
series1->setName("scatter1");
series1->setMarkerShape(QScatterSeries::MarkerShapeCircle);
series1->setMarkerSize(10.0);
for(qreal x(0.1);x<=8.0;x+=0.3)
{
for(qreal y(0.1);y<4.0;y+=0.3)
{
*series1 << QPointF(x,y);
}
}
QScatterSeries *series2 = new QScatterSeries();
series2->setName("scatter2");
series2->setMarkerShape(QScatterSeries::MarkerShapeCircle);
series2->setMarkerSize(10.0);
QChart *chart = new QChart();
chart->addSeries(series1);
chart->addSeries(series2);
chart->setTitle("散点单击展示");
chart->legend()->setMarkerShape(QLegend::MarkerShapeFromSeries);
chart->createDefaultAxes();
chart->axes(Qt::Vertical).first()->setRange(0,4);
chart->axes(Qt::Horizontal).first()->setRange(0,8);
chart->setAnimationOptions(QChart::SeriesAnimations);
chart->setDropShadowEnabled(false);
/* 图例 */
chart->legend()->setVisible(true); // 是否显示
chart->legend()->setAlignment(Qt::AlignBottom); // 显示位置
QChartView *chartView = new QChartView(chart);
chartView->setRenderHint(QPainter::Antialiasing);
QObject::connect(series1,&QScatterSeries::clicked,chartView,[=](const QPointF &point){
QPointF clickedPoint = point;
QPointF closest(INT_MAX, INT_MAX);
qreal distance(INT_MAX);
const auto points = series1->points();
for (const QPointF ¤tPoint : 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;
}
}
series1->remove(closest);
series2->append(closest);
});
QMainWindow window;
window.setWindowTitle("散点单击展示实例");
window.setCentralWidget(chartView);
window.resize(600,300);
window.show();
return a.exec();
}