2

我有一个 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++;
}
4

1 回答 1

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()行以查看它在哪里死亡。

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

希望有帮助。

于 2013-03-12T22:33:10.677 回答