在实时绘图中仅绘制QwtCurve的一部分

时间:2013-03-12 14:34:25

标签: c++ qt qwt

我有一个QVector,我不断附加数据,所以我可以在QwtPlot上绘图。但是频率很高,我猜测矢量太大而程序崩溃了。

我的问题是,如何创建一个仅在某个时间点开始的QwtCurve,因为已经绘制的矢量中没有必要已经过去的时间。

这是我的代码:

QVector<double> xv;
QVector<double> cv1;
QVector<double> cv2;

作为全局变量,

void gui::process_new_info(QByteArray array)
{
    int v = 0;

    double f = ui->frequency->value();

    xv.append(sizeof_array/f);

    char *buf = array.data();

    if (ui->ecgPlux->isChecked() == true || ui->channel_1->currentIndex() != 0)
    {
        cv1.append(buf[1]);

        QwtPlotCurve *curve1 = new QwtPlotCurve;
        curve1->attach(plot_all[0]);
        curve1->setData(xv,cv1);
        curve1->setPen(QPen(Qt::blue,1));
        plot_all[0]->replot();

        QwtPlotCurve *curve2 = new QwtPlotCurve;
        curve2->attach(plot[0]);
        curve2->setData(xv,cv1);
        curve2->setPen(QPen(Qt::blue,1));
        plot[0]->replot();
    }

    if (ui->xyzPlux->isChecked() == true || ui->channel_2->currentIndex() != 0)
    {
        cv2.append(buf[2]);

        QwtPlotCurve *curve3 = new QwtPlotCurve;
        curve3->attach(plot_all[1]);
        curve3->setData(xv,cv2);
        curve3->setPen(QPen(Qt::blue,1));
        plot_all[0]->replot();

        QwtPlotCurve *curve4 = new QwtPlotCurve;
        curve4->attach(plot[1]);
        curve4->setData(xv,cv1);
        curve4->setPen(QPen(Qt::blue,1));
        plot[1]->replot();
    }

    //printf ("%d ->", buf[0]);
    fprintf (data, "%d,", buf[0]);

    for (int i = 1; i < 9; i++)
    {
        v = buf[i];
        //printf ("%d,", v);
        fprintf (data, "%d,", v);
    }

    //printf ("\n");
    fprintf (data, "\n");

    sizeof_array++;
}

1 个答案:

答案 0 :(得分:2)

QwtPlotCurve

http://qwt.sourceforge.net/class_qwt_plot_curve.html

继承自QwtPlotSeriesItem

http://qwt.sourceforge.net/class_qwt_plot_series_item.html

setData

中有警告
  

该项目取得数据对象的所有权,在不再使用时将其删除。

可能不是你的成长太大......可能是你正在访问Qwt删除的东西。

在调试器中运行它,查看堆栈跟踪中的死亡位置,或者放入一堆qDebug()行以查看它的死亡位置。

如果数据太大,您可以在设置矢量之前弹出矢量头部的项目。

希望有所帮助。