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

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

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用 QtCharts 进行二维坐标图绘制的基本步骤如下: 1. 引入头文件 在代码中引入 QtCharts 模块的头文件: ```cpp #include <QtCharts> ``` 2. 创建 QChart 对象 创建一个 QChart 对象,用于绘制图表: ```cpp QChart *chart = new QChart; ``` 3. 设置图表标题 使用 setTitle() 函数设置图表的标题: ```cpp chart->setTitle("My Chart"); ``` 4. 创建数据系列 使用 QLineSeries、QScatterSeries 或 QBarSeries 等类创建数据系列,分别用于绘制线图、散点图或柱状图: ```cpp QLineSeries *series = new QLineSeries; ``` 5. 添加数据 使用 append() 函数向数据系列中添加数据: ```cpp series->append(0, 1); series->append(1, 3); series->append(2, 4); ``` 6. 将数据系列添加到图表中 使用 addSeries() 函数将数据系列添加到图表中: ```cpp chart->addSeries(series); ``` 7. 创建坐标轴 使用 QValueAxis 或 QDateTimeAxis 等类创建 X 轴或 Y 轴: ```cpp QValueAxis *axisX = new QValueAxis; axisX->setTitleText("X Axis"); chart->addAxis(axisX, Qt::AlignBottom); QValueAxis *axisY = new QValueAxis; axisY->setTitleText("Y Axis"); chart->addAxis(axisY, Qt::AlignLeft); ``` 8. 将坐标轴添加到图表中 使用 addAxis() 函数将 X 轴或 Y 轴添加到图表中: ```cpp series->attachAxis(axisX); series->attachAxis(axisY); ``` 9. 显示图表 将图表添加到视图中,并显示出来: ```cpp QChartView *chartView = new QChartView(chart); chartView->setRenderHint(QPainter::Antialiasing); chartView->show(); ``` 以上是使用 QtCharts 进行二维坐标图绘制的基本步骤,可以根据具体的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

糊涂小书虫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值