zoukankan      html  css  js  c++  java
  • Qt绘制动态曲线

    首先*.pro文件中加一句

    QT       += charts

    然后
    mainwindow.cpp文件如下:
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include "QtCharts/QChart"
    #include "QLineSeries"
    #include "QValueAxis"
    #include "QTimer"
    #include "QTime"
    #include "QList"
    #include "qmath.h"
    #include "QPointF"
    #include "QDebug"
    
    
    //#include <QtCharts/QChartGlobal>
    #include "QChartView"
    
    
    QT_CHARTS_USE_NAMESPACE
    QChart *m_chart;
    QLineSeries *m_series;
    //QList<double> dataList;//存储业务数据
    int maxSize = 5000;
    int tem=0,flag=0;
    //QTimer updateTimer;
    int timeId;
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),//默认初始化?
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
    
        m_chart = new QChart;//图表类
        QChartView *chartView = new QChartView(m_chart);//图表视窗类
    //    v.setRubberBand(QChartView::HorizontalRubberBand);
        chartView->setRubberBand(QChartView::RectangleRubberBand);//在图表窗口设置矩形橡皮筋
    //    chartView->setRubberBand();
    
    
        m_series = new QLineSeries;//线 连续类
        m_chart->addSeries(m_series);//在图表类添加连续线
    
    
        for(int i=0;i<maxSize;++i){
           m_series->append(i,0);//在线连续类附加坐标x&y
        }
        m_series->setUseOpenGL(true);//openGl 加速
        qDebug()<<m_series->useOpenGL();
    
    
        QValueAxis *axisX = new QValueAxis;//数值轴类
        axisX->setRange(0,maxSize);//设置X坐标的范围
        axisX->setLabelFormat("%g");//设置标签格式
        axisX->setTitleText("axisX");//设置X坐标的标题名称
    
    
        QValueAxis *axisY = new QValueAxis;
        axisY->setRange(0,2000);//设置Y坐标的范围  可以设置负数
        axisY->setTitleText("axisY");//设置Y坐标的标题名称
    
    
        m_chart->setAxisX(axisX,m_series);//将轴添加在图表中
        m_chart->setAxisY(axisY,m_series);//
        m_chart->legend()->hide();//图列隐藏 有一个蓝色的小点被隐藏了。
        m_chart->setTitle("demo");//设置曲线表的名称
    
    
        QVBoxLayout *layout = ui->verticalLayout;//垂直布局 方框类
        layout->addWidget(chartView);//在方框内添加图表视窗
        timeId = startTimer(0);//感觉像是刷新频率的延时。 定义了timeId整型变量作为刷新的定时器变量。
    }
    
    
    
    
    double MainWindow::getData(double time){
    
    
        double s = qCos( time * M_PI * 2 ) ;
        return s;
    }
    
    
    void MainWindow::timerEvent(QTimerEvent *event){//定时器事件
        if(event->timerId()==timeId){//定时器到时间,//模拟数据填充
            static QTime dataTime(QTime::currentTime());//现在的时间
            long int eltime = dataTime.elapsed();//消逝的时间
            static int lastpointtime = 0;//最后一点时间
            int size = (eltime - lastpointtime);//数据个数
            qDebug()<<"size-->"<<size;
            if(isVisible()){//判断一个控件是否可见
                //矢量类 < 打印函数类 >
                QVector<QPointF> oldPoints = m_series->pointsVector();//线连续类 点向量//Returns the points in the series as a vector
                QVector<QPointF> points;//点
    
    
                 for(int i=size;i<oldPoints.count();++i){
                     points.append(QPointF(i-size ,oldPoints.at(i).y()));//替换数据用
                 }
    
    
                    if(tem < 1000 && flag == 0)
                    {
                        tem+=10;
                        if(tem>=999)
                            flag=1;
                    }
                    if(tem >0 && flag==1)
                    {
                        tem-=10;
                        if(tem<=0)
                            flag=0;
                    }
                 qint64 sizePoints = points.count();
                  for(int k=0;k<size;++k){
                    //points.append(QPointF(k+sizePoints,1.2*getData((((double)lastpointtime+k+1)/1000))));
                    points.append(QPointF(k+sizePoints,tem));
                 }
                m_series->replace(points);//替换以前的点
                lastpointtime = eltime;//消逝的时间复制给最后一点的时间。
           }
        }
    }
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    然后mainwindow.h如下:
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    
    #include <QMainWindow>
    
    
    namespace Ui {
    class MainWindow;
    }
    
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    protected:
        void timerEvent(QTimerEvent *event) Q_DECL_OVERRIDE;
    private:
        Ui::MainWindow *ui;
        double getData(double time);
    
    
    };
    
    
    #endif // MAINWINDOW_H
    在此作者的基础上做了一些备注与修改:
    https://blog.csdn.net/HiccupHiccup/article/details/74996618
  • 相关阅读:
    ACE反应器(Reactor)模式(1)
    net 命令
    ACE反应器(Reactor)模式(2)
    恢复SQLServer实例连接 (转载)
    在SQL Server Management Studio中可以运行作业但是用TSQL运行则失败 (转载)
    VirtualBox 之 共享磁盘
    从 IClassFactory 为 CLSID 为 {0002450000000000C000000000000046} 的 COM 组件创建实例失败,原因是出现以下错误: 8001010a解决办法 .
    SQLServer数据类型优先级对性能的影响 (转)
    封装getElementsByAttribute
    js中setAttribute 的兼容性
  • 原文地址:https://www.cnblogs.com/jiuqiang/p/10048259.html
Copyright © 2011-2022 走看看