Реклама

QCustomPlot исчезает часть графика при перестроении

Здравствуйте.

Построил график на основе http://www.qcustomplot.com/index.php/demos/financialchartsdemo
При перестроении графика очищается окно методом clearPlottables();
При следующем построении volumeAxisRect остается пустым, не строится. Скажите пожалуйста, почему и как это исправить?
  • #
  • 3 декабря 2017 г. 21:07
День добрый.
Нужно проверить указатель на volumeAxisRect . Вполне возможно, что он вообще там nullptr после выполнения этого метода.
И нужно заново пересоздавать его. А также заполнять данными заново.

Проверил так

QCPAxisRect *volumeAxisRect = new QCPAxisRect(ui->customPlot);
    qDebug()<<"volumeAxisRect"<<volumeAxisRect;
Выдает так:

volumeAxisRect QCPAxisRect(0x1dd3c620)

bool QCPLayoutGrid::addElement(int, int, QCPLayoutElement*) There is already an element in the specified row/column: 1 0

Может нужно как то иначе очистить полотно?

Значит нужно его заново нормально переинициализировать переменными и т.д.

Он проинициализирован так.

QCPAxisRect *volumeAxisRect = new QCPAxisRect(ui->customPlot);

Описан так:

    ui->customPlot->plotLayout()->addElement(1, 0, volumeAxisRect); //добавить элимент
    volumeAxisRect->setMaximumSize(QSize(QWIDGETSIZE_MAX, 100));//макс размер макета
    volumeAxisRect->axis(QCPAxis::atBottom)->setLayer("axes");  //добавить слой
    volumeAxisRect->axis(QCPAxis::atBottom)->grid()->setLayer("grid");  //сетка
    //принесите нижней и главной оси прямоугольник ближе друг к другу: // bring bottom and main axis rect closer together:
    ui->customPlot->plotLayout()->setRowSpacing(0);
    volumeAxisRect->setAutoMargins(QCP::msLeft|QCP::msRight|QCP::msBottom);
    volumeAxisRect->setMargins(QMargins(0, 0, 0, 0));
    //создать две планки для положительных (зеленых) и отрицательных (красных) объемных баров: // create two bar plottables, for positive (green) and negative (red) volume bars:
    ui->customPlot->setAutoAddPlottableToLegend(false);
    QCPBars *volumePos = new QCPBars(volumeAxisRect->axis(QCPAxis::atBottom), volumeAxisRect->axis(QCPAxis::atLeft));
    QCPBars *volumeNeg = new QCPBars(volumeAxisRect->axis(QCPAxis::atBottom), volumeAxisRect->axis(QCPAxis::atLeft));
    //volumePos->setData(bar,Volume);

    for (long long i=0; i<NBar; i++)
    {
        (Open[i] > Close[i] ? volumeNeg : volumePos)->addData(bar[i], Volume[i]);
    }
    volumePos->setData(bar, Volume); // задает значения объемов
    volumePos->setWidth(VolumeWidth);//ширина столбика
    volumePos->setPen(Qt::NoPen);
    volumePos->setBrush(QColor(100, 180, 110));
    volumeNeg->setWidth(VolumeWidth);//ширина столбика
    volumeNeg->setPen(Qt::NoPen);
    volumeNeg->setBrush(QColor(180, 90, 90));
Скажите пожалуйста что плохо сделано и что нужно заменить?

тут дебажить нужно, что у вас там не работает. или что там игнорируется.

Запустил с дебагом, ошибок не выдает.

При первой прорисовке графика, нижний график(график объемов) рисуется, при перестроении графика, с верхним все в порядке, нижний пустой. Пробовал
  for (long long i=0; i<NBar; i++)
    {
        (Open[i] > Close[i] ? volumeNeg : volumePos)->addData(bar[i], Volume[i]);
    }
заменить
volumePos->setData(bar,Volume);
но все равно эта непрорисовка оставалась.
Потому и надеялся что можно стереть всю информацию с виджета, это бы наверно решило вопрос.

Говорят такой сбой получатся из-за добавления элементов макета при последующих использованиях.  Видимо при первом запуске нужно создать элементы макета, а при последующих их заполнять.

Скажите пожалуйста, как создать макет только 1-й раз, а последующие разы к нему обращаться?
Если делаю так
if (FirstPaintingGraph==true) {QCPAxisRect *volumeAxisRect = new QCPAxisRect(ui->customPlot);}
то volumeAxisRect не виден за пределами {}.

Объявить volumeAxisRect в заголовочном файле

Заработало, спасибо

Реклама

Ответы

Только авторизованные пользователи могут отвечать на форуме.
Пожалуйста, Авторизуйтесь или Зарегистрируйтесь
  • JaJay
  • 17 декабря 2017 г. 5:16

C++ - Тест 002. Константы

  • Результат 58 баллов
  • Очки рейтинга -2
  • JaJay
  • 17 декабря 2017 г. 4:55

C++ - Тест 001. Первая программа и типы данных

  • Результат 93 баллов
  • Очки рейтинга 8
  • JaJay
  • 17 декабря 2017 г. 4:48

C++ - Тест 001. Первая программа и типы данных

  • Результат 66 баллов
  • Очки рейтинга -1
Последние комментарии
  • EVILEG
  • 7 декабря 2017 г. 9:47

Django - Урок 011. Добавление комментариев на сайт с Django

Визуальный пример чего? комментариев? При ответе на конкретный комментарий рядом с ником отвечающего будет стрелочка и указание ник другого пользователя. Который будет ссылкой на коммента...

  • Bernar
  • 7 декабря 2017 г. 9:24

Django - Урок 011. Добавление комментариев на сайт с Django

есть визуальный пример ?

  • EVILEG
  • 6 декабря 2017 г. 11:30

Django - Урок 011. Добавление комментариев на сайт с Django

Да, так будет даже лучше, я на сайте уже обновил до такого вида код Вот это уже не нужно if request.method == 'POST': Поскольку Вы и так используете метод post, то есть эта про...

  • Bernar
  • 6 декабря 2017 г. 11:19

Django - Урок 011. Добавление комментариев на сайт с Django

сделал немного по другому class EArticleView(View): template_name = 'knowledge/article.html' comment_form = CommentForm def get(self, request, *args, **kwargs): ...

Сейчас обсуждают на форуме
  • EVILEG
  • 16 декабря 2017 г. 17:23

Пауза в многопоточности

QFuture, который возвращается QtConcurrent::map имеет методы pause() и resume() и теоретически должен поддерживать этот функционал. Но для Qt...

  • Миша
  • 15 декабря 2017 г. 11:26

Как найти в QVector макс и мин

Спасибо

  • Galant
  • 14 декабря 2017 г. 19:58

LPT

Понял! Спасибо!

  • EVILEG
  • 14 декабря 2017 г. 13:38

QCustomPlot можно ли построить прерывистую линию на одном графике?

Во-первых: В pro файле проект по идее достаточно указать следующий define для включения возможности рендеринга через OpenGL DEFINES += QCUSTOMPLOT_USE_OPENGL И во вторых:...

  • EVILEG
  • 13 декабря 2017 г. 8:05

В многопоточности выполнять действие только в одном из потоков

Статическиe методs QThread::currentThread(); и QThread::currentThreadId() могут возвращать указатель на поток и его handle id соответственно. Можете попробовать через как...