Qt数据可视化QChart - QScatterSeries散点图(点击操作)

本文介绍了一个使用 Qt Charts 模块创建散点图的示例程序。该程序展示了如何通过 Qt Charts 库创建两个散点系列,并实现点击删除当前散点系列中的点并将其添加到另一个散点系列的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意:必须使用命名空间: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 &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;
            }
        }

        series1->remove(closest);
        series2->append(closest);
    });

    QMainWindow  window;
    window.setWindowTitle("散点单击展示实例");
    window.setCentralWidget(chartView);
    window.resize(600,300);
    window.show();
    return a.exec();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千笺客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值