Реклама
  • 13 декабря 2017 г. 15:34

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

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

Можно ли используя QCustomPlot  построить прерывистую линию в одном графике? Пример желаемого показан в приложении.
  • #
  • 13 декабря 2017 г. 18:56

День добрый!

Да, можно. Только не ясно, в каком смысле прерывистую? Если вам нужны прерывистые данные, то придётся строить с помощью нескольких графов.
Если вам просто нужна прерывистая линия у графика, то настраивайте QPen, которым рисуете через setStyle()

На данный момент я строю много графиков с линиями, но при очень большем их количестве грузится компьютер.

Мне нужно строить линии графика между нечетными и четными точками, а между четными и нечетными не отображать. Видимо мне нужно задать прорисовку линии с помощью setDashPattern
Нашел такой пример:
 QPen pen;
 QVector<qreal> dashes;
 qreal space = 4;
 dashes << 1 << space << 3 << space << 9 << space
            << 27 << space << 9 << space;
 pen.setDashPattern(dashes);
Но как узнать длину пикселей между точками? И что будет с линиями при сжимании и растягивании графика?

Честно... Бардак будет при растягивании и сжимании графика, даже перерасчёт будет весьма накладным...
Насчёт загрузки ПК, то здесь теориетически можно улучшить ситуацию с включением OpenGL в QCustomPlot . Дело в том, что отрисовка по умолчанию производится силами процессора, и при большом количестве графики это будет довольно накладный процесс. Но QCustomPlot содержит возможность отрисовки через контекст OpenGL, что может несколько улучшить ситуацию со скоростью отрисовки.

Там есть макрос.
QCUSTOMPLOT_USE_OPENGL
В pro файле проект по идее достаточно указать следующий define
DEFINES += QCUSTOMPLOT_USE_OPENGL
И применить на QCustomPlot включение использования OpenGL
void QCustomPlot::setOpenGl(bool  enabled, int  multisampling = 16);
По умолчанию раскадровка идёт на 16 кадров.

Попробуйте для начала использовать эту возможность.

В теле функции рисования я добавляю линии так. Скажите пожалуйста, как тут использовать OpenGL?

if (XSell1.size()>0)//добовление линии между точками buy-sell на видимом участке
        {
            //NGraph=NGraph+1;
            for (long long i=0;i<YSell1.size();i++)
            {
                //if((XBuy1[i]>FirstVisibleBar&&XBuy1[i]<LastVisibleBar)||(XSell1[i]>FirstVisibleBar&&XSell1[i]<LastVisibleBar))
                {
                    ui->customPlot->addGraph(ui->customPlot->xAxis, ui->customPlot->yAxis);  //Создает новый график внутри сюжета
                    QPen Pen1;
                    if(YSell1[i]>YBuy1[i])
                    {
                        Pen1.setColor(QColor(Qt::green));//ui->customPlot->graph()->setPen(QPen(Qt::green)); //graph()- Возвращает граф с индексом . Если индекс недействителен, он возвращает 0. -> line color blue for first graph
                    }
                    else
                    {
                        Pen1.setColor(QColor(Qt::red));//ui->customPlot->graph()->setPen(QPen(Qt::red));
                    }
                    ui->customPlot->graph()->addData(XBuy1[i],YBuy1[i]);
                    ui->customPlot->graph()->addData(XSell1[i],YSell1[i]);
                    Pen1.setWidthF(SizeLineBuy);//ширина линии
                    ui->customPlot->graph()->setPen(Pen1);

                }
            }
        }

 

Во-первых:

В pro файле проект по идее достаточно указать следующий define для включения возможности рендеринга через OpenGL
DEFINES += QCUSTOMPLOT_USE_OPENGL
И во вторых:
ui->customPlot->setOpenGl(true);
Вызвать нужн после создания QCustomPlot, вызывать какждый раз при пперерисовки графика как я понимаю не требуется.
Теоретически это должно повысить производительность отрисовки, но иногда я сталкивался с тем, что это работало из рук вон плохо для обычных виджетов. Но здесь вопрос в том, чтобы правильно всё настроить. Но полагаю, что разработчик QCustomPlot это всё оттестировал.
Реклама

Ответы

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

Qt - Тест 001. Сигналы и слоты

  • Результат 100 баллов
  • Очки рейтинга 10
  • falcon
  • 16 января 2018 г. 17:22

Qt - Тест 001. Сигналы и слоты

  • Результат 68 баллов
  • Очки рейтинга -1
  • falcon
  • 16 января 2018 г. 17:18

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

  • Результат 73 баллов
  • Очки рейтинга 1
Последние комментарии

QML - Урок 021. Переключение между окнами в QML

Спасибо всем. Все получилось. Прикручиваю логику.

  • BlinCT
  • 14 января 2018 г. 19:28

Разработка на Qt под iOS

Вот честно, на сколько же муторно под огрызок что то делать. Куча проблем) А вод линь или под Андроид все просто и тривиально))

  • folax
  • 12 января 2018 г. 9:16

QML - Урок 021. Переключение между окнами в QML

Ничего сложного, делаете по тех заданию 3 файла qml, называете их как указанно в тех задании, потом из первого окна через Loader их переключаете, в окне 2 и 3 делаете сигналы которые при закры...

QML - Урок 021. Переключение между окнами в QML

Все верно, я и не говорил что этот кусок кода лично мое произведение. Это тоже верно: Это задание для прохождения на собеседование в одну из крупных украинских IT компаний. Логику ...

  • folax
  • 12 января 2018 г. 8:13

QML - Урок 021. Переключение между окнами в QML

int main(int argc, char *argv[]){ QApplication app(argc, argv); Logic logic; QQmlApplicationEngine engine; engine.rootContext()->setContextProperty("logic", &logic)...

Сейчас обсуждают на форуме

Как проверить доступность сервера

Точно!!! Я сейчас так пробую QNetworkReply *replay_news = networkManager_news->get(QNetworkRequest(QUrl(url_news)));connect(networkManager_news, &QNetworkAccessManager::...

ChartView. Отображение метки данных точки серии при наведении курсора

Спасибо большущее за советы! Все получилось через ScatterSeries. Методы remove() как-то сходу не дались, удаляет в первый раз, а потом программа падает... Не стал тратить время и воспользовалс...

QGraphicsScene

спасибо, за подробное объяснение строчки, а с зумом я разобрался, все работает

  • EVILEG
  • 15 января 2018 г. 17:21

Qt webgl

Насчёт проверки подключения клиента я не в курсе. Что касается экземпляров приложения, то из того, что я читал получается, что нет необходимости в нескольких экземплярах для нескольких кл...

  • EVILEG
  • 15 января 2018 г. 11:39

Проблема добавления #DEFINE при сборке CMak'ом

А Вы не пробовали сделать предкомпилированные библиотеки boost под свою систему, а потом уже подключать собранные библиотеки Boost`а? Просто один только boost может собираться на пару гиг...