本代码实现的功能:

  1. 实时动态双曲线
  2. 可以鼠标拖拽
  3. 可以保留已经产生的数据
  4. 随着鼠标的移动实时显示X、Y轴坐标

在.pro中

QT       += charts

在ChartView.h中

#ifndef __CHARTVIEW_H__
#define __CHARTVIEW_H__
#include 
#include 
QT_CHARTS_USE_NAMESPACE
class ChartView : public QChartView
{
public:
    ChartView(QChart *chart, QWidget *parent = 0);
protected:
    void keyPressEvent(QKeyEvent *event);
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
private:
    bool isClicking;
    int xOld;
    int yOld;
    QGraphicsSimpleTextItem* m_coordItem;
};
#endif /* __CHARTVIEW_H__ */

在ChartView.cpp中

#include "chartview.h"
ChartView::ChartView(QChart *chart, QWidget *parent) :
    QChartView(chart, parent),
    isClicking(false),
    xOld(0), yOld(0)
{
    setRubberBand(QChartView::RectangleRubberBand);
}
void ChartView::mousePressEvent(QMouseEvent *event)
{
    if (event->button() & Qt::LeftButton) {
        isClicking = true;
    } else if (event->button() & Qt::RightButton) {
        chart()->zoomReset();
    }
    QChartView::mousePressEvent(event);
}
void ChartView::mouseMoveEvent(QMouseEvent *event)
{
    int x, y;
    if (!m_coordItem)
    {
        m_coordItem = new QGraphicsSimpleTextItem(this->chart());
        m_coordItem->setZValue(5);
        m_coordItem->setPos(100, 60);
        m_coordItem->show();
    }
    const QPoint curPos = event->pos();
    QPointF curVal = this->chart()->mapToValue(QPointF(curPos));
    QString coordStr = QString("X = %1, Y = %2").arg(curVal.x()).arg(curVal.y());
    m_coordItem->setText(coordStr);
    if (isClicking) {
        if (xOld == 0 && yOld == 0) {
        } else {
            x = event->x() - xOld;
            y = event->y() - yOld;
            chart()->scroll(-x, y);
        }
        xOld = event->x();
        yOld = event->y();
        return;
    }
    QChartView::mouseMoveEvent(event);
}
void ChartView::mouseReleaseEvent(QMouseEvent *event)
{
    if (isClicking) {
        xOld = yOld = 0;
        isClicking = false;
    }
    /* Disable original right click event */
    if (!(event->button() & Qt::RightButton)) {
        QChartView::mouseReleaseEvent(event);
    }
}
void ChartView::keyPressEvent(QKeyEvent *event)
{
    switch (event->key()) {
    case Qt::Key_Left:
        chart()->scroll(-10, 0);
        break;
    case Qt::Key_Right:
        chart()->scroll(10, 0);
        break;
    case Qt::Key_Up:
        chart()->scroll(0, 10);
        break;
    case Qt::Key_Down:
        chart()->scroll(0, -10);
        break;
    default:
        keyPressEvent(event);
        break;
    }
}

在MainWindow.h中

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include 
#include "qmessagebox.h"
//QChart
#include 
using namespace QtCharts;
//定时器
#include 
#include "chartview.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private slots:
    void updata_plot();
    void on_pushButton_clicked();
    void on_pushButton_2_clicked();
private:
    //绘图定时器
    QTimer *timer_plot;
    //曲线
    QSplineSeries* line;
    QSplineSeries* line1;
    //曲线点的最大数量
    int line_max = 100;
    int a = 1;
    int b = 2;
    int c = 0;
    ChartView *chartView;
    //绘图变量和坐标
    QChart* chart;
    QValueAxis *axisX;
    QValueAxis *axisY;
    void initchar();
private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

在MainWindow.cpp中

#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //将变量实例化
    timer_plot = new QTimer(this);
    connect(timer_plot,SIGNAL(timeout()),this,SLOT(updata_plot()));
    initchar();
    axisX = new QValueAxis(this);
    axisY = new QValueAxis(this);
    this->setWindowTitle("速度对比");
    timer_plot->start(50);
}
//图像更新函数
void MainWindow::updata_plot()
{
    QVector list;
    QVector newlist;
    QVector list1;
    QVector newlist1;
    list = line->pointsVector();//获取现在图中列表
    if (list.size() < line_max)
    {
        //保持原来
        newlist = list;
    }
    else
    {
        //错位移动
        newlist = list;
        c = c + 1;
        chart->axisX()->setRange(0+c,100+c);
    }
    a = a+2;
    newlist.append(QPointF(newlist.size(),a));//最后补上新的数据
    line->replace(newlist);//替换更新
    line->setName("期望速度");//设置曲线名称
    line->setPen(QColor(255, 0, 0));//设置曲线颜色
    line->setUseOpenGL(true);//openGl 加速
    list1 = line1->pointsVector();//获取现在图中列表
    if (list1.size() < line_max)
    {
        //保持原来
        newlist1 = list1;
    }
    else
    {
        //错位移动
        newlist1 = list1;
    }
    b = b+3;
    newlist1.append(QPointF(newlist1.size(),b));//最后补上新的数据
    line1->replace(newlist1);//替换更新
    line1->setName("当前速度");//设置曲线名称
    line1->setPen(QColor(100, 100, 0));//设置曲线颜色
    line1->setUseOpenGL(true);//openGl 加速
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::on_pushButton_clicked()
{
    timer_plot->start(50);//启动定时器
}
void MainWindow::on_pushButton_2_clicked()
{
    timer_plot->stop();//关闭定时器
}
void MainWindow::initchar()
{
    line = new QSplineSeries(this);
    chart = new QChart();
    chart->addSeries(line);
    line1 = new QSplineSeries(this);
    chart->addSeries(line1);
    chart->removeSeries(line1);
    chart->addSeries(line1);
    chart->setTitle("速度对比");//设置图标标题
    chart->removeSeries(line);
    chart->addSeries(line);
    chart->createDefaultAxes();//设置坐标轴
    chart->axisX()->setRange(0,100);
    chart->axisY()->setRange(0,1500);
//    chart->legend()->hide();
    chartView = new ChartView(chart);
    chartView->setRenderHint(QPainter::Antialiasing);
    ui->horizontalLayout_2->addWidget(chartView);
}

在MainWindow.ui中

chart控件做实时曲线显示_「Qt」利用QChart实现实时动态的曲线数据展示(进化版)相关推荐

  1. qchart 坐标轴设置_「Qt」利用QChart实现实时动态的曲线数据展示

    根据项目需求,需要在Qt中进行绘图显示我们的数据.这时候,我们就用到了Qt在5.0之后新增的自带QChart控件,不再需要我们自己再去添加第三方库.下面是详细的介绍~ 在.pro文件中 QT += c ...

  2. chart控件做实时曲线显示_组态王实时趋势曲线控件介绍,让你对此不再陌生

    一.组态王实时趋势控件的特点 1. 通过TCPIP获得实时数据,数据服务器可以是任何一台运行组态王的机器,而不需进行组态王网络配置. 2. 最多可以显示20条曲线. 3. 可以设置每条曲线的绘制方式, ...

  3. chart控件做实时曲线显示_基于GDI+技术开发工业仪表盘控件

    写在前面 上次给大家看了一个上位机界面之后,很多人表示对那个仪表盘的开发感兴趣,今天就跟大家分享一下整个的开发过程,由于整个仪表盘开发的过程还是有些复杂的,无法将所有的代码都一一展示,所以重点跟大家分 ...

  4. chart控件做实时曲线显示_Python 如何实时绘制数据

    提到 GUI 绘图,大家可能第一反应是 OpenGL 和 Matplotlib,但其实基于 Qt 平台还有个功能强大的 pyqtgraph 绘图库,不仅支持丰富的图形种类,还能实时更新绘图数据并进行交 ...

  5. chart控件做实时曲线显示_用PyQt5.QtChart实现动态曲线图

    之前一直用爬虫捉取路由实时上下载的记录用数据库保存,有时可用matplotlib来查看时间与上下传的曲线图,但是静态的,查询的时间段需自行认定,虽然qt的日历类可以比较方便取日期按日期查,但总觉要点有 ...

  6. chart控件做实时曲线显示_Spark+Kafka+WebSocket+eCharts实时分析-完全记录(5)

    Kafka环境搭建与测试 Python生产者/消费者测试 Spark接收Kafka消息处理,然后回传到Kafka Flask引入消费者 WebSocket实时显示 版本: spark-2.4.3-bi ...

  7. python做地图导航_「Python」利用高德地图做你想做之事

    玩grasshopper基本上都知道OpenStreetMap 这个地图网站,毕竟有一个好用的地图插件,可以在Rhino中绘制出所需,但是一个不好的地方就在于国内的数据量太少,无法满足我们的需求. 此 ...

  8. chart控件删除最左边点_常见功能测试点的测试用例大全

    登录.添加.删除.查询模块是我们经常遇到的,这些模块的测试点该如何考虑? 1)登录 ① 用户名和密码都符合要求(格式上的要求) ② 用户名和密码都不符合要求(格式上的要求) ③ 用户名符合要求,密码不 ...

  9. delphi控件切图界面闪烁_「这个控件叫什么」系列之加载占位图+页面指示器

    @龙爪槐守望者 :鉴于国内交互设计名词混乱不统一,很多设计师不知道如何用专业术语称呼一个控件,因此我开了<这个控件叫什么>专题,梳理控件的名称和使用事项,希望能为推动交互设计发展,做出一点 ...

最新文章

  1. IBM发明世界首个人造神经元,人工智能的底层硬件基石已完成!
  2. 《算法:C语言实现》—— 第二部分 —— 第3章 —— 基本数据结构
  3. codesys 简单案例_第一章:初识Codesys-1.4从一个示例程序讲起
  4. CAP定理(CAP theorem)
  5. spider-抓取网页内容(Beautiful soup)
  6. 《企业迁云实战》——1.3 云服务的发展现状
  7. python函数参数值_python 函数参数
  8. 喜马拉雅音频下载+x2m文件转换
  9. 新版edge浏览器没有internet选项怎么办?
  10. matlab设置时间步长,时间步长的设置问题
  11. 用k-mer分析进行基因组调查:(六)用KmerGenie一步实现
  12. 未明学院:爬取微博关注列表,带你一窥“饭碗cp”的人际网
  13. 再Windows下 .Pages格式怎么保存为word或者PDF格式
  14. acwing 2041.干草堆
  15. java线程锁死是什么
  16. LVM逻辑卷管理和挂盘操作
  17. java课堂作业部分
  18. 计算机显示器模糊,电脑显示器模糊的原因和解决方法【图文】
  19. hello,bili
  20. 实时流媒体视频监控系统——的流媒体客户端——视频解码处理

热门文章

  1. Unity 全面理解加载和内存管理
  2. linux下添加新硬盘的方法
  3. 将Windows8或WindowsServer2012装在VHD上
  4. js获取当前月的第一天和最后一天
  5. NeHe OpenGL第二十五课:变形
  6. YAML_15 include and roles
  7. vue_axios请求封装、异常拦截统一处理
  8. 密码学-网站的安全登录认证设计
  9. [English] notes
  10. 【azkaban】学习azkaban的笔记以及心得