М
Миша30 ноября 2017 г. 2:22

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

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

Построил график на основе http://www.qcustomplot.com/index.php/demos/financialchartsdemo
При перестроении графика очищается окно методом clearPlottables();
При следующем построении volumeAxisRect остается пустым, не строится. Скажите пожалуйста, почему и как это исправить?
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

9
Evgenii Legotckoi
  • 3 декабря 2017 г. 16:07
День добрый.
Нужно проверить указатель на volumeAxisRect . Вполне возможно, что он вообще там nullptr после выполнения этого метода.
И нужно заново пересоздавать его. А также заполнять данными заново.
    М
    • 4 декабря 2017 г. 1:41

    Проверил так

    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

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

      Evgenii Legotckoi
      • 4 декабря 2017 г. 3:01

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

        М
        • 4 декабря 2017 г. 3:15

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

        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));
        Скажите пожалуйста что плохо сделано и что нужно заменить?
          Evgenii Legotckoi
          • 4 декабря 2017 г. 16:01

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

            М
            • 5 декабря 2017 г. 2:19

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

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

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

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

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

                  М
                  • 11 декабря 2017 г. 7:32

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

                    Комментарии

                    Только авторизованные пользователи могут публиковать комментарии.
                    Пожалуйста, авторизуйтесь или зарегистрируйтесь
                    d
                    • dsfs
                    • 26 апреля 2024 г. 11:56

                    C++ - Тест 004. Указатели, Массивы и Циклы

                    • Результат:80баллов,
                    • Очки рейтинга4
                    d
                    • dsfs
                    • 26 апреля 2024 г. 11:45

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

                    • Результат:50баллов,
                    • Очки рейтинга-4
                    d
                    • dsfs
                    • 26 апреля 2024 г. 11:35

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

                    • Результат:73баллов,
                    • Очки рейтинга1
                    Последние комментарии
                    k
                    kmssr9 февраля 2024 г. 2:43
                    Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                    АК
                    Анатолий Кононенко5 февраля 2024 г. 9:50
                    Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                    EVA
                    EVA25 декабря 2023 г. 18:30
                    Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
                    J
                    JonnyJo25 декабря 2023 г. 16:38
                    Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
                    G
                    Gvozdik19 декабря 2023 г. 5:01
                    Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
                    Сейчас обсуждают на форуме
                    G
                    Gar22 апреля 2024 г. 12:46
                    Clipboard Как скопировать окно целиком в clipb?
                    DA
                    Dr Gangil Academics20 апреля 2024 г. 14:45
                    Unlock Your Aesthetic Potential: Explore MSC in Facial Aesthetics and Cosmetology in India Embark on a transformative journey with an msc in facial aesthetics and cosmetology in india . Delve into the intricate world of beauty and rejuvenation, guided by expert faculty and …
                    a
                    a_vlasov14 апреля 2024 г. 13:41
                    Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
                    Павел Дорофеев
                    Павел Дорофеев14 апреля 2024 г. 9:35
                    QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
                    f
                    fastrex4 апреля 2024 г. 11:47
                    Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…

                    Следите за нами в социальных сетях