М
Миша30. November 2017 02:22

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

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

Построил график на основе http://www.qcustomplot.com/index.php/demos/financialchartsdemo
При перестроении графика очищается окно методом clearPlottables();
При следующем построении volumeAxisRect остается пустым, не строится. Скажите пожалуйста, почему и как это исправить?
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

9
Evgenii Legotckoi
  • 3. Dezember 2017 16:07
День добрый.
Нужно проверить указатель на volumeAxisRect . Вполне возможно, что он вообще там nullptr после выполнения этого метода.
И нужно заново пересоздавать его. А также заполнять данными заново.
    М
    • 4. Dezember 2017 01: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. Dezember 2017 03:01

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

        М
        • 4. Dezember 2017 03: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. Dezember 2017 16:01

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

            М
            • 5. Dezember 2017 02: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. Dezember 2017 02:50

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

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

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

                  М
                  • 11. Dezember 2017 07:32

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

                    Kommentare

                    Nur autorisierte Benutzer können Kommentare posten.
                    Bitte Anmelden oder Registrieren
                    Letzte Kommentare
                    A
                    ALO1ZE19. Oktober 2024 08:19
                    Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                    ИМ
                    Игорь Максимов5. Oktober 2024 07:51
                    Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                    d
                    dblas55. Juli 2024 11:02
                    QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                    k
                    kmssr8. Februar 2024 18:43
                    Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                    Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                    Jetzt im Forum diskutieren
                    J
                    JacobFib17. Oktober 2024 03:27
                    добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
                    JW
                    Jhon Wick1. Oktober 2024 15:52
                    Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
                    КГ
                    Кирилл Гусарев27. September 2024 09:09
                    Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
                    F
                    Fynjy22. Juli 2024 04:15
                    при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

                    Folgen Sie uns in sozialen Netzwerken