QCharts 后面可能不会再用了,但是记录下绘历史曲线图

634 阅读2分钟
  • 直接按横纵坐标值绘制
    // 划了两条曲线
    // 类似于QGraphicsView组件,用来显示曲线
    QChartView *chartView = new QChartView(ui->graphicsView);
    QChart *chart = new QChart();
    //    chart->setTitle("简单函数曲线");
    chartView->setChart(chart);//设置新chart,会自动清除之前的chart
    chartView->setGeometry(0,0,this->width()-240,this->height()-25);
    // 创建曲线序列
    QLineSeries *series0 = new QLineSeries();
    QLineSeries *series1 = new QLineSeries();
    series0->setName("3A6B");
    series1->setName("3A7B");
    chart->addSeries(series0);
    chart->addSeries(series1);
    // chartView->setGeometry(QRect(0,0,500,500));
    // 序列添加数值
    qreal t = 0, y1, y2, intv = 0.1;
    int cnt = 200;
    for(int i = 0; i < cnt; ++i){
    y1 = qSin(t);//真好,连头文件都不用添加了,嘻嘻嘻
    series0->append(t, y1);
    
    y2=qCos(t);
    series1->append(t,y2);
    
    t+=intv;  //每次角度增加
    }
    chartView->setRenderHint(QPainter::Antialiasing);
    
    // 创建坐标
    QValueAxis *axisX = new QValueAxis;
    axisX->setRange(0, 10);//设置坐标轴范围
    axisX->setTitleText("时间");//标题
    axisX->setLabelFormat("%.1f"); //标签格式:每个单位保留1位小数
    axisX->setTickCount(1); //主分隔个数:0到10分成20个单位
    axisX->setMinorTickCount(1); //每个单位之间绘制了多少虚网线
    
    QValueAxis *axisY = new QValueAxis; //Y 轴
    axisY->setRange(-10,70);
    axisY->setTitleText("温度");
    axisY->setLabelFormat("%.1f"); //标签格式
    axisY->setTickCount(10);
    axisY->setMinorTickCount(4);
    
    //为序列设置坐标轴
    chart->setAxisX(axisX, series0);
    chart->setAxisY(axisY, series0);
    
    chart->setAxisX(axisX, series1);
    chart->setAxisY(axisY, series1);
    
  • 横坐标可能是时间戳, 那么显示就要友好点
    • 注意,将数据(时间戳(秒级))放到QLineSeries直线容器里,需要把时间戳转成毫秒级
    //类似于QGraphicsView组件,用来显示曲线
    QChartView *chartView = new QChartView(ui->graphicsView);  
    // 支持鼠标缩放
    chartView->setRubberBand(QChartView::RectangleRubberBand);
    
    QChart *chart = new QChart();
    
    // 支持缩放  
    chart->scroll(-10, 5);//整体平移(-10, 5),两个参数分别为Δx和Δy
    chart->zoom(0.9);  //整体缩放,参数为放缩系数,<1代表缩小,>1代表放大  
    
    chartView->setChart(chart);//设置新chart,会自动清除之前的chart
    chartView->setGeometry(0, 0, this->width() - 240, this->height() - 25);
    //创建曲线序列
    QLineSeries *series0 = new QLineSeries();
    series0->setName("3A6B");
    chart->addSeries(series0);
    // 序列添加数值
    qreal t = 0, y1, y2, intv = 0.1;
    int cnt = 200;
    QMessageBox::information(nullptr, "info", QString::fromStdString(std::to_string(items.size())));
    
    // 老老实实从容器中取出数据  
    for (uint64_t i = 0; i < items.size(); ++i)
    {
            series0->append(items.at(i).timestamp*1000, items.at(i).temperature);
    }
    chartView->setRenderHint(QPainter::Antialiasing);
    
    // x 轴为时间轴
    QDateTimeAxis* axisX = new QDateTimeAxis();
    // axisX->setFormat("yyyy-M-d HH:mm s");// 145°时:"yyyy-M-d HH:mm s\""  
    axisX->setFormat("M-d HH:mm s");// 145°时:"yyyy-M-d HH:mm s\""  
    const uint64_t how_long_for_show = 60 * 60 * 2; /*60 * 60 * 24 * 30 */;	// default 30 days	
    axisX->setMin(QDateTime::fromSecsSinceEpoch(time(0) - how_long_for_show));
    axisX->setMax(QDateTime::fromSecsSinceEpoch(time(0)));
    axisX->setTickCount(1); //主分隔个数:0到10分成20个单位
    axisX->setLabelsAngle(1);
    
    QValueAxis *axisY = new QValueAxis; //Y 轴
    axisY->setRange(-10, 70);  	
    axisY->setTitleText("Temperature");
    axisY->setLabelFormat("%.1f"); //标签格式
    axisY->setTickCount(10);
    axisY->setMinorTickCount(4);
    
    //为序列设置坐标轴
    chart->addAxis(axisX, Qt::AlignBottom);
    chart->addAxis(axisY, Qt::AlignLeft);
    series0->attachAxis(axisX);
    series0->attachAxis(axisY);  
    series0->show();