как очистить график в QCustomPlot?

Рейтинг: 0Ответов: 2Опубликовано: 30.07.2023

отображаю график из 80 позиций , но когда вывожу на печать ресуется все 100 позиций. Пытался использовать wGraphic->graph(0)->clearData(); ничего не дало, а также wGraphic->clearPlottables(); wGraphic->clearGraphs();это вообще приводило к ошибке памяти.

.h

...
    QCustomPlot *wGraphic;      // Объявляем объект QCustomPlot
   ...
    QVector <double> x; // пока так размеры выставим
    QVector <double> y;

.срр

    // Инициализируем объект полотна для графика ...
    wGraphic = new QCustomPlot();
    ui->gridLayout->addWidget(wGraphic,2,0,5,5); // ... и устанавливаем
...
 // Добавляем график на полотно
    wGraphic->addGraph(wGraphic->xAxis, wGraphic->yAxis);

    // Подписываем оси координат
    wGraphic->xAxis->setLabel("итерации");
    wGraphic->yAxis->setLabel("Дб");

    // Устанавливаем максимальные и минимальные значения координат
    wGraphic->xAxis->setRange(0,100);
    wGraphic->yAxis->setRange(-50,50);

    // Отрисовываем содержимое полотна
    wGraphic->replot();

    // добавляем красную линию на график
    wGraphic->addGraph(); // red line
    wGraphic->graph(0)->setPen(QPen(QColor(255, 110, 40)));
...
    // тут размеры отрис векторов
    x.reserve(80);
    y.reserve(80);
    // устанавливаем одно значение для всех элементов
    x.fill(0);
    y.fill(0);
...
    x << str_x.toDouble();
    y << str_y.toDouble();

//    qDebug() << "str_priem: " << str_priem;


    qDebug() << "str_x: " << str_x;
    qDebug() << "str_y: " << str_y;

//    wGraphic->graph(0)->clearData();


    wGraphic->graph(0)->setData(y,x);     // Устанавливаем координаты точек графика

//        wGraphic->clearPlottables(); выдаёт ошибку памяти
//    wGraphic->clearGraphs(); выдаёт ошибку памяти

    // Отрисовываем содержимое полотна
    wGraphic->replot();

    //  ???
    wGraphic->update();

    // Очищаем принятую строку
    str_priem.clear();

введите сюда описание изображения

а хотелось чтобы было что то типо такого

введите сюда описание изображения


Заменил файлы qcustomplot.cpp, qcustomplot.h на те которые скачал по ссылке https://github.com/eugesh/QCustomPlot работает также как и преведущий вариант

из плюсов теперь при вызове clear не разваливается программа .

void MainWindow::slotProcessDatagrams()
{
    QByteArray baDatagram_in;
    do {
        baDatagram_in.resize(m_pudp_in->pendingDatagramSize());
        m_pudp_in->readDatagram(baDatagram_in.data(), baDatagram_in.size());
    } while(m_pudp_in->hasPendingDatagrams());

    QDataStream in(&baDatagram_in, QIODevice::ReadOnly);
    in.setVersion(QDataStream::Qt_5_3);

    in >>  str_priem; // принимаем сообщение

    str_x = str_priem.section(' ',0,0);
    str_y = str_priem.section(' ',1);

    x << str_x.toDouble();
    y << str_y.toDouble();

    qDebug() << "str_x: " << str_x;
    qDebug() << "str_y: " << str_y;

    // чистим старое отрисовываем новое
    wGraphic->graph(0)->clear();
    wGraphic->graph(0)->rescaleAxes();

    wGraphic->graph(0)->setData(y,x);     // Устанавливаем координаты точек графика

    // Отрисовываем содержимое полотна
    wGraphic->replot();

    // Очищаем принятую строку
    str_priem.clear();
}

введите сюда описание изображения

Ответы

▲ 0Принят

В общем ошибка была одна я почему то думал что выставив размер вектора , он сам будет всё выправлять , но это оказалось не так

void MainWindow::slotProcessDatagrams()
{
    QByteArray baDatagram_in;
    do {
        baDatagram_in.resize(m_pudp_in->pendingDatagramSize());
        m_pudp_in->readDatagram(baDatagram_in.data(), baDatagram_in.size());
    } while(m_pudp_in->hasPendingDatagrams());

    QDataStream in(&baDatagram_in, QIODevice::ReadOnly);
    in.setVersion(QDataStream::Qt_5_3);

    in >>  str_priem; // принимаем сообщение

    str_x = str_priem.section(' ',0,0);
    str_y = str_priem.section(' ',1);

    if(my_int >= 80)
    {
        // clear firs element
//        x.pop_back();
//        y.pop_back();
//        x.removeLast();
//        y.removeLast();
        x.pop_front(); //последний из вектора 
        y.pop_front();

        x << str_x.toDouble();
        y << str_y.toDouble();
    }
    else
    {
        x << str_x.toDouble();
        y << str_y.toDouble();
        my_int = my_int + 1;
    }

    // чистим старое отрисовываем новое
    wGraphic->graph(0)->clear();
    wGraphic->graph(0)->rescaleAxes();

//    wGraphic->replot();     // Отрисовываем содержимое полотна
    wGraphic->graph(0)->setData(y,x);     // Устанавливаем координаты точек графика

    wGraphic->replot();     // Отрисовываем содержимое полотна

    // Очищаем принятую строку
    str_priem.clear();
}

Правда новая ошибка прыгнула (почему то последняя и первая точка почему то соединяется , не знаю как разорвать)

введите сюда описание изображения

▲ 2

Если я правильно понял вопрос, то для очищения графика я реализовал функцию:

template <class DataType>
void QCPAbstractPlottable1D<DataType>::clear()
{
    if (!mDataContainer.isNull())
        if (!mDataContainer->isEmpty())
            mDataContainer->clear();
}

Которую вызываю:

            graph->clear();
            graph->rescaleAxes();