Qt Charts - 绘制简单曲线图(1)

这篇具有很好参考价值的文章主要介绍了Qt Charts - 绘制简单曲线图(1)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 概述

QSplineSeries类是Qt图表模块中的一个曲线系列类,用于绘制平滑的二次和三次曲线。这个系列通过在给定的数据点之间插值来绘制曲线,从而使得曲线更加平滑。
使用QSplineSeries时,需要将数据点作为QPointF类型的列表传递给数据集。然后将数据集添加到QChart中。可以使用QSplineSeries的其他方法来设置线条颜色、宽度、拐点形状等。

2 主要功能

  1. 动态绘制曲线图
  2. 放大、缩小以及还原图表视图
  3. 实时获取图表坐标值

3 功能步骤

3.1 动态曲线图

  1. .pro文件加入模块,charts。
QT       += core gui charts
  1. 在设计师界面拖拽一个QGraphicsView控件,提升为自己重写的MyChartView类。
    qt 曲线绘制,# Qt图表,qt,ui,开发语言,c++
    qt 曲线绘制,# Qt图表,qt,ui,开发语言,c++
  2. MyChartView类以及MainWindow类头文件里加入图表命名空间,以及对应头文件。
#include <QChartView>

QT_CHARTS_USE_NAMESPACE
// 或者 using namespace QtCharts;
  1. 主要代码
// 头文件相关声明
const int AXIS_MIN_X =   0;
const int AXIS_MAX_X =  50;
const int AXIS_MIN_Y = -50;
const int AXIS_MAX_Y =  50;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private Q_SLOTS:
    void onTimeOut();

private:
    void createChart();  // 创建图表

private:
    Ui::MainWindow *ui;

    QChart *chart;
    QSplineSeries *series;
    QValueAxis *axisX;
    QTimer *timer;
    QRandomGenerator *randGenerator;
    int m_lastY;                        // 记录series上一次y轴值
    bool m_pause;                       // 记录是否暂停绘图
    bool m_start;                       // 记录是否启动绘图
    QLabel *m_labXYValue;
};
// 构造函数
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    , m_lastY(0)
    , m_pause(false)
    , m_start(false)
{
    ui->setupUi(this);

    timer = new QTimer(this);
    randGenerator = QRandomGenerator::global();
    m_labXYValue = new QLabel("X = , Y = ", this);
    ui->statusbar->addWidget(m_labXYValue);

    createChart(); // 创建图表

    connect(timer, &QTimer::timeout, this, &MainWindow::onTimeOut);
}
// 创建图表
void MainWindow::createChart()
{
    chart = new QChart;
    ui->chartView->setChart(chart);
    ui->chartView->setRenderHint(QPainter::Antialiasing);

    series = new QSplineSeries;
    series->setName("随机数动态曲线");

    QPen pen;
    pen.setStyle(Qt::SolidLine);
    pen.setWidth(2);
    pen.setColor(QColor(30, 144, 255));
    series->setPen(pen);

    chart->addSeries(series);

    axisX = new QValueAxis;
    axisX->setRange(AXIS_MIN_X, AXIS_MAX_X); // 设置坐标轴范围
    axisX->setLabelFormat("%.1f"); // 标签格式
    axisX->setTickCount(6); // 坐标轴刻度的数量
//    axisX->setMinorTickCount(2); // 坐标轴小刻度的数量
    axisX->setMinorGridLineVisible(true);
    axisX->setTitleText("X轴"); //标题

    QValueAxis *axisY = new QValueAxis;
    axisY->setRange(AXIS_MIN_Y, AXIS_MAX_Y);
    axisY->setLabelFormat("%.1f");
    axisY->setTickCount(11);
//    axisY->setMinorTickCount(2);
    axisY->setMinorGridLineVisible(true);
    axisY->setTitleText("Y轴");

    chart->addAxis(axisX, Qt::AlignBottom);
    chart->addAxis(axisY, Qt::AlignLeft);

    series->attachAxis(axisX); // 需在chart->addSeries(series)后
    series->attachAxis(axisY);

    //-----------
    series->append(QPointF(0.0, 0.0));
}

主要的思路就是通过使用定时器并设置一定的间隔,不断往序列添加QPointF。绘制到图表并显示到图表视图上。这里的QPointF是通过Qt的随机数生成器类QRandomGenerator来生成曲线序列y轴值,具体的序列点也可以通过实际采集的数据来进行显示。

// count: 全局静态统计x轴值的变量
void MainWindow::onTimeOut()
{
    timer->stop();
    if(count > AXIS_MAX_X) {
        series->remove(0);
        chart->axes(Qt::Horizontal, series).at(0)->setMin(count - AXIS_MAX_X);
        chart->axes(Qt::Horizontal, series).at(0)->setMax(count);
    }
    int y = randGenerator->bounded(m_lastY - 15, m_lastY + 16);
    if (y < AXIS_MIN_Y) { // 生成的y轴值小于y轴最小值
        y += 15;
    } else if (y > AXIS_MAX_Y) { // 生成的y轴值大于y轴最大值
        y -= 15;
    }
    series->append(QPointF(count, y));
    m_lastY = y; // 记录series上一次y轴值
    count += 2;
    timer->start(300);
}

3.2 放大、缩小以及还原

通过QChart类提供的函数实现

void MainWindow::on_actZoomIn_triggered()
{
    chart->zoom(1.2);
}
void MainWindow::on_actZoomOut_triggered()
{
    chart->zoom(0.8);
}
void MainWindow::on_actZoomReset_triggered()
{
    chart->zoomReset();
}

3.3 实时获取图表坐标值

  1. 在自己的图表视图类里添加自定义鼠标移动信号,以及重写父类鼠标移动事件。
class MyChartView : public QChartView
{
    Q_OBJECT
public:
    explicit MyChartView(QWidget *parent = nullptr);

protected:
    void mouseMoveEvent(QMouseEvent *event) override;
    void wheelEvent(QWheelEvent *event) override;

signals:
    void mouseMovePoint(QPoint point);
};
  1. 源文件定义

setMouseTracking(true) 将鼠标跟踪设置为true(缺省为false)。如果不设置为true,窗口组件只在某个鼠标按键按下时才接收鼠标移动事件,设置为true 之后,只要鼠标移动就会发射mouseMoveEvent()事件。

MyChartView::MyChartView(QWidget *parent) : QChartView(parent)
{
    setMouseTracking(true);
}

void MyChartView::mouseMoveEvent(QMouseEvent *event)
{
    QPoint point = event->pos();
    emit mouseMovePoint(point);
    QChartView::mouseMoveEvent(event);
}

void MyChartView::wheelEvent(QWheelEvent *event)
{
    // 垂直滚动
    if (event->angleDelta().y() > 0) {
        chart()->zoom(1.2);
    } else {
        chart()->zoom(0.8);
    }
    QChartView::wheelEvent(event);
}
  1. 在窗口类(MainWindow)里连接与MyChartView类的信号槽。
connect(ui->chartView, &MyChartView::mouseMovePoint, this, &MainWindow::onMouseMovePoint);

void MainWindow::onMouseMovePoint(QPoint point)
{
    QPointF pos = ui->chartView->chart()->mapToValue(point);
    m_labXYValue->setText(QString("X = %1, Y = %2")
        .arg(QString::number(pos.x(), 'f', 2))
        .arg(QString::number(pos.y(), 'f', 2)));
}

4 具体效果

qt 曲线绘制,# Qt图表,qt,ui,开发语言,c++文章来源地址https://www.toymoban.com/news/detail-759597.html

到了这里,关于Qt Charts - 绘制简单曲线图(1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于IMX6ULL的AP3216C的QT动态数据曲线图显示

    前言: 本文为手把手教学 Linux+QT 的典型基础项目 AP3216C 的数据折线图显示,项目使用正点原子的 IMX6ULL  阿尔法( Cortex-A7 系列)开发板。项目需要实现 AP3216C 在 Linux 系统下的驱动,使用 QT 设计 AP3216C 的数据显示页面作为项目的应用层。该项目属于非常简单的入门级项目,核心

    2024年02月16日
    浏览(38)
  • 98.qt qml-使用曲线图综合示例、支持多种鼠标交互、支持百万数据显示(已适配黑白风格)

    在上章我们只是简单实现了曲线图和折线图的显示: 79.qt qml-如何在QML中使用QCustomPlot之曲线/折线示例(已适配黑白风格)_qml 折线图_诺谦的博客-CSDN博客 所以本章实现综合示例、并添加多种功能如下所示: 详细显示:鼠标任意移动显示具体值内容 鼠标右击: 弹出菜单栏,支持

    2024年02月05日
    浏览(50)
  • 【MATLAB】动态绘制曲线图(二维曲线)

    先看效果 ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 主程序: 加载数据的部分我省略了,就是data1这个矩阵 动态绘图函数: 这里暂时只支持设置线性、颜色、markerstyle这三个参数吧,主要是用 line() 这个函数把点连起来,设置line的参数就是曲线的样式,查看帮助文档 doc line 可以自定

    2024年02月16日
    浏览(32)
  • PyLab绘制曲线图

    PyLab 是一个面向 Matplotlib 的绘图库接口,其语法和 MATLAB 十分相近。它和 Pyplot 模快都够实现 Matplotlib 的绘图功能。PyLab 是一个单独的模块,随 Matplotlib 软件包一起安装,该模块的导包方式和 Pyplot 不同,如下所示: PyLab 是一个很便捷的模块,下面对它的使用方法做相应的介绍

    2024年02月16日
    浏览(43)
  • C++ Qt开发:Charts折线图绘制详解

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍 QCharts 折线图的常用方法及灵活运用。 折线图(Line Chart)是一种常用的数据可

    2024年02月04日
    浏览(33)
  • C++ Qt开发:Charts绘制各类图表详解

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍 TreeWidget 与 QCharts 的常用方法及灵活运用。 在之前的文章中笔者介绍了如何使

    2024年02月04日
    浏览(32)
  • 【QCustomPlot】绘制 x-y 曲线图

    使用 QCustomPlot 绘图库辅助开发时整理的学习笔记。同系列文章目录可见 《绘图库 QCustomPlot 学习笔记》目录。本篇介绍如何使用 QCustomPlot 绘制 x-y 曲线图,需要 x 轴数据与 y 轴数据都已知,示例中使用的 QCustomPlot 版本为 Version 2.1.1 ,QT 版本为 5.9.2 。 目录 说明 1. 示例工程配

    2024年02月09日
    浏览(37)
  • Qt Charts - 实时曲线

    按照之前的一篇文章,先在工程中添加QChart、QChartView,代码如下: 然后定义两个坐标轴,一个用作X轴,一个用作Y轴, 添加头文件: 创建两个QValueAxis: 在构造函数中,对两个坐标轴进行实例化,把X轴范围设置为0-10并放置在坐标系的底部,Y轴范围设置为0-10并放置在坐标系的

    2024年02月06日
    浏览(37)
  • C++ Qt开发:Charts折线图绑定事件

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍 QCharts 折线图的常用方法及灵活运用。 在上一篇文章中笔者介绍了关于 QChart

    2024年02月04日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包