Графики в QT - как?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 01.08.21 18:41
Оценка:
Здравствуйте!

Сначала полистал кутишные примеры — ничего полезного не нашел. Вообще, по примерам сложилось впечатление, что Qt — это куча каких мало кому нужных свистоперделок. Ну ладно, это лирика.

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

1) Нужен временной график функции, данные приходят от железа. Просто отображать, ничего особенного. Но хочется, чтобы хранением данных, прокруткой и тп заведовало Qt, чтобы самому писать по минимуму.

2) Хочу рисовать биржевые свечки

3) Хочу рисовать биржевые свечки, и поверх них — свои графики


Полистал тут интернеты — ситуация не самая радужная. Есть вроде QtCharts, но он платный, чего хотелось бы избежать.

Из бесплатного что нашел — сторонний QCustomPlot — вроде то, что нужно для моего п. 1

Для п. 2 вроде бы подходит искаробочный Graphics View Framework — сделать свой класс, который отображает элемент, и добавляй себе. Вроде ничего.

А вот для п. 3 — не совсем понятно, получится ли рисовать поверх свечек свои графики.


Что ещё посоветуете?
Маньяк Робокряк колесит по городу
Re: Графики в QT - как?
От: Igore Россия  
Дата: 01.08.21 18:54
Оценка: 17 (2) +1
Здравствуйте, Marty, Вы писали:

M>Вообще, у меня есть несколько задач по графикам из разных областей, местами не связанных.


M>1) Нужен временной график функции, данные приходят от железа. Просто отображать, ничего особенного. Но хочется, чтобы хранением данных, прокруткой и тп заведовало Qt, чтобы самому писать по минимуму.

M>2) Хочу рисовать биржевые свечки
M>3) Хочу рисовать биржевые свечки, и поверх них — свои графики

M>Полистал тут интернеты — ситуация не самая радужная. Есть вроде QtCharts, но он платный, чего хотелось бы избежать.

M>Из бесплатного что нашел — сторонний QCustomPlot — вроде то, что нужно для моего п. 1
M>Для п. 2 вроде бы подходит искаробочный Graphics View Framework — сделать свой класс, который отображает элемент, и добавляй себе. Вроде ничего.
M>А вот для п. 3 — не совсем понятно, получится ли рисовать поверх свечек свои графики.

M>Что ещё посоветуете?

https://qwt.sourceforge.io/

Вроде бесплатно, то что ты хочешь есть https://qwt.sourceforge.io/otherscreenshots.html Trading Chart
Сам графиками на Qt не пользовался, поэтому с п. 3 не подскажу, ну и плюс можешь еще поискать на https://marketplace.qt.io/
Re: Графики в QT - как?
От: SаNNy Россия  
Дата: 02.08.21 05:55
Оценка: 4 (1)
Здравствуйте, Marty, Вы писали:

M>А вот для п. 3 — не совсем понятно, получится ли рисовать поверх свечек свои графики.


Разве https://www.qcustomplot.com/index.php/demos/financialchartsdemo не то, что нужно?
Re: Графики в QT - как?
От: AlexGin Беларусь  
Дата: 02.08.21 09:36
Оценка: 17 (2)
Здравствуйте, Marty, Вы писали:

M>Здравствуйте!


M>Сначала полистал кутишные примеры — ничего полезного не нашел. Вообще, по примерам сложилось впечатление, что Qt — это куча каких мало кому нужных свистоперделок. Ну ладно, это лирика.


M>Вообще, у меня есть несколько задач по графикам из разных областей, местами не связанных.


M>1) Нужен временной график функции, данные приходят от железа. Просто отображать, ничего особенного. Но хочется, чтобы хранением данных, прокруткой и тп заведовало Qt, чтобы самому писать по минимуму.


Qwt библиотеку я применял для этого:
https://qwt.sourceforge.io/index.html
https://stackoverflow.com/questions/31058642/qwt-can-we-plot-an-area-chart
Скачивал отсюда:
https://sourceforge.net/projects/qwt

По второму и третьему пункту, возможно подходит вот это:
https://qwt.sourceforge.io/otherscreenshots.html
Отредактировано 02.08.2021 9:51 AlexGin . Предыдущая версия . Еще …
Отредактировано 02.08.2021 9:39 AlexGin . Предыдущая версия .
Re[2]: Графики в QT - как?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 02.08.21 16:00
Оценка:
Здравствуйте, SаNNy, Вы писали:

M>>А вот для п. 3 — не совсем понятно, получится ли рисовать поверх свечек свои графики.


SNN>Разве https://www.qcustomplot.com/index.php/demos/financialchartsdemo не то, что нужно?


Похоже на то, да, спасибо
Маньяк Робокряк колесит по городу
Re[2]: Графики в QT - как?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 02.08.21 16:01
Оценка:
Здравствуйте, AlexGin, Вы писали:

M>>Вообще, у меня есть несколько задач по графикам из разных областей, местами не связанных.


M>>1) Нужен временной график функции, данные приходят от железа. Просто отображать, ничего особенного. Но хочется, чтобы хранением данных, прокруткой и тп заведовало Qt, чтобы самому писать по минимуму.


AG>Qwt библиотеку я применял для этого:

AG>https://qwt.sourceforge.io/index.html
AG>https://stackoverflow.com/questions/31058642/qwt-can-we-plot-an-area-chart
AG>Скачивал отсюда:
AG>https://sourceforge.net/projects/qwt

AG>По второму и третьему пункту, возможно подходит вот это:

AG>https://qwt.sourceforge.io/otherscreenshots.html

Спасибо, это тоже похоже на то, что нужно
Маньяк Робокряк колесит по городу
Re: Графики в QT - как?
От: Skorodum Россия  
Дата: 12.08.21 14:05
Оценка:
Здравствуйте, Marty, Вы писали:

M>Полистал тут интернеты — ситуация не самая радужная. Есть вроде QtCharts, но он платный, чего хотелось бы избежать.

Использую. Работает нормально, но руками приходится писать даже для довольно простого случая
  Картинка

Ресурсов ест мало, GPU использует.
qt qtcharts
Re: Докладываю
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 05.09.21 17:37
Оценка: 17 (4)
Здравствуйте, Marty, Вы писали:

Докладываю:

1) QWT показалась мне более богатой на возможности, поэтому решил использовать её
У нас нет строгой установки если какие-то мелкие утилиты для компа пишутся — MSVC 17/19, MinGW 7.3/8.1Ну, и соответственно, если либы (обычно свои, правда) обычно подо всё это собираются.
В общем, разобрался я, как QWT собрать под все варианты, собрал. Полная сборка с release/debug — больше полудня заняла.
Собрал сэмплы, посмотрел что как работает.
Стал вкорячивать в свою прогу — содрал с примера один к одному — падает. По шагам в вижуалке не пройти — F11 — и падает, а в метод QWTшный не заходит. Всё вроде корректно на входе, и хз почему падает и не ходит по шагам. Что-то грусть-тоска взяла.
Глупо потратил время на сборку

UPD Батники для сборки QWT залил на гитхаб — https://github.com/al-martyn1/qwt_windows_build_scripts
Там же можно скачать архив с собранными вариантами QWT и сэмплами (сэмплы собраны только под MinGW 7.3) и батником для деплоя qwt_windeploy.bat (при сборке он генерится с тем путём, который задан как выходной каталог, а готовый из архива надо поправить, прописав путь, куда разархивирована QWT).
Есть описание на корявом инглише


2) Попробовал QCustomPlot
Почему сразу с него не начал — показался каким-то несерьёзным на первый взгляд, всего два файла, cpp/h. Оказалось, что это было глупо — два файла там просто потому, что их сделали амальгамэшином.
А вообще — по возможностям плюс минус не сильно хуже QWT. В QWT там конечно есть некоторые красивые контролы, но, в принципе, никто не мешает использовать и то и другое.
Большой плюс — собирается быстро, и нормально можно по нутряшкам подебажить. Ну и заработало сразу
Маньяк Робокряк колесит по городу
Отредактировано 06.09.2021 21:48 Marty . Предыдущая версия .
Re[2]: Докладываю
От: AlexGin Беларусь  
Дата: 15.09.21 07:54
Оценка:
Здравствуйте, Marty, Вы писали:

M>Здравствуйте, Marty, Вы писали:


M>Докладываю:


M>1) QWT показалась мне более богатой на возможности, поэтому решил использовать её

+100500
Это отличная библиотека. Мы её используем (применяем под Linux Ubuntu). В Windows под MSVC — Qwt не применял.

M>Стал вкорячивать в свою прогу — содрал с примера один к одному — падает. По шагам в вижуалке не пройти — F11 — и падает...


И под MSVC, и под MinGW одинаково падает?

В таких случаях, откладываю в сторону дебаггер и отлаживаюсь логированием. Т.е. через лог-файл.
Вот что применяю для этого:
https://github.com/gabime/spdlog

M>2) Попробовал QCustomPlot...


Да, полезно знать, что и у Qwt есть альтернатива.
Отредактировано 15.09.2021 8:09 AlexGin . Предыдущая версия .
Re[3]: Докладываю
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 15.09.21 07:57
Оценка:
Здравствуйте, AlexGin, Вы писали:


M>>Стал вкорячивать в свою прогу — содрал с примера один к одному — падает. По шагам в вижуалке не пройти — F11 — и падает...


AG>В таких случаях, откладываю в сторону дебаггер и отлаживаюсь логированием. Т.е. через лог-файл.

AG>Вот что применяю для этого:
AG>https://github.com/gabime/spdlog


А я не понял вообще, как это происходило — создавался виджет, вызывались методы. Потом доходило до вызова какого-то метода вроде даже без параметров, и бац — аксес виолейшн. Их хз что там за адрес, откуда он взялся. Какими логами ты такое отловишь?
Маньяк Робокряк колесит по городу
Re[4]: Докладываю
От: AlexGin Беларусь  
Дата: 15.09.21 08:15
Оценка:
Здравствуйте, Marty, Вы писали:

M>Здравствуйте, AlexGin, Вы писали:



M>>>Стал вкорячивать в свою прогу — содрал с примера один к одному — падает. По шагам в вижуалке не пройти — F11 — и падает...


AG>>В таких случаях, откладываю в сторону дебаггер и отлаживаюсь логированием. Т.е. через лог-файл.

AG>>Вот что применяю для этого:
AG>>https://github.com/gabime/spdlog


M>А я не понял вообще, как это происходило — создавался виджет, вызывались методы. Потом доходило до вызова какого-то метода вроде даже без параметров, и бац — аксес виолейшн. Их хз что там за адрес, откуда он взялся. Какими логами ты такое отловишь?


1) Собрать минимальный вариант данного примера (может быть — падает из-за особенностей Вашего приложения, или даже ошибок в нём).
2) Проверить на MinGW — есть ли такой же самый эффект (я так понял, что падало при сборке под MSVC).
3) Да, крайний случай через логирование. Выводим в лог-файл значение переменных (например — указатель, чтобы знать что он НЕ нулевой).
Re[5]: Докладываю
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 15.09.21 17:50
Оценка:
Здравствуйте, AlexGin, Вы писали:

M>>А я не понял вообще, как это происходило — создавался виджет, вызывались методы. Потом доходило до вызова какого-то метода вроде даже без параметров, и бац — аксес виолейшн. Их хз что там за адрес, откуда он взялся. Какими логами ты такое отловишь?


AG>1) Собрать минимальный вариант данного примера (может быть — падает из-за особенностей Вашего приложения, или даже ошибок в нём).


Ну это не про логи. Мне лень было делать МВП, поэтому я свалил на QCustomPlot
Несомненно, проблема была в моём приложении. Только я не понял, где

Тут подумалось, что проблема могла быть в том, что я собрал DLLку как-то не так. Хотя, примеры из QWT я с ней собрал, и они работают. Если есть желание/настроение, можешь попробовать мою сборку и глянуть мои батники для сборки


AG>2) Проверить на MinGW — есть ли такой же самый эффект (я так понял, что падало при сборке под MSVC).


Был и на MinGW


AG>3) Да, крайний случай через логирование. Выводим в лог-файл значение переменных (например — указатель, чтобы знать что он НЕ нулевой).


Смысл? До вызова метода я нормально ставил бряк и в отладчике все указатели и пр внимательно проверял. И вот только что вышли из метода объекта, стою на строчке вызова другого метода — F11 — крэш не пойми где с обращением по какому-то непонятному адресу
Маньяк Робокряк колесит по городу
Re[6]: Докладываю
От: AlexGin Беларусь  
Дата: 16.09.21 05:19
Оценка:
Здравствуйте, Marty, Вы писали:

M>Ну это не про логи. Мне лень было делать МВП, поэтому я свалил на QCustomPlot

M>Несомненно, проблема была в моём приложении. Только я не понял, где

Я бы — попробовал разобраться в чём проблема. Обычно потом вылезает в самый неподходящий момент.
При этом, совсем не обязательно отказаться от применения QCustomPlot.
Просто определиться, что именно мешало применению Qwt.

M>Тут подумалось, что проблема могла быть в том, что я собрал DLLку как-то не так. Хотя, примеры из QWT я с ней собрал, и они работают. Если есть желание/настроение, можешь попробовать мою сборку и глянуть мои батники для сборки.


Хорошо, сбрось исходники и всё остальное (лучше — ссылочку на GitHub).
Попробую хоть чем-то помочь.

Сбрось на почту:
alexgin1965@gmail.com или же: alexgin1965@mail.ru

AG>>3) Да, крайний случай через логирование. Выводим в лог-файл значение переменных (например — указатель, чтобы знать что он НЕ нулевой).


M>Смысл? До вызова метода я нормально ставил бряк и в отладчике все указатели и пр внимательно проверял.


На выделенное выше ты тратил огромное время (с точки зрения программного процесса).
Уточню — время основного, или как ещё называют интерфейсного потока выполнения — aka main-thread.
А что же в это время делел, например рабочий поток (aka worker-thread), о котором ты забыл во время отладки?
Может этот worker-thread, не найдя свежих данных (из-за задержки main-thread), грохнулся об nullptr?

В наших разработках — такое, ну или что-то подобное бывает нередко.
Вот тут на помощь приходит отладка логированием, тот же spdlog.

Тогда, логируюя переменные головного (main-thread) и вспомогательного (worker-thread) потоков,
выясняем эту проблему и, например, чиним синхронизацию потоков, чтобы worker-thread коррктно ждал.
Ну или что-либо другое, в зависимости от причины.
Отредактировано 16.09.2021 5:45 AlexGin . Предыдущая версия . Еще …
Отредактировано 16.09.2021 5:34 AlexGin . Предыдущая версия .
Отредактировано 16.09.2021 5:24 AlexGin . Предыдущая версия .
Re[7]: Докладываю
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 16.09.21 08:20
Оценка:
Здравствуйте, AlexGin, Вы писали:

AG>Я бы — попробовал разобраться в чём проблема. Обычно потом вылезает в самый неподходящий момент.

AG>При этом, совсем не обязательно отказаться от применения QCustomPlot.
AG>Просто определиться, что именно мешало применению Qwt.

Мне было лень, и я отказался от QWT


M>>Тут подумалось, что проблема могла быть в том, что я собрал DLLку как-то не так. Хотя, примеры из QWT я с ней собрал, и они работают. Если есть желание/настроение, можешь попробовать мою сборку и глянуть мои батники для сборки.

AG>
AG>Хорошо, сбрось исходники и всё остальное (лучше — ссылочку на GitHub).
AG>Попробую хоть чем-то помочь.

На либу — кидал — https://github.com/al-martyn1/qwt_windows_build_scripts

Или ты прям не прочь в самих моих сорцах поковыряться? Вечерком скину, ок


M>>Смысл? До вызова метода я нормально ставил бряк и в отладчике все указатели и пр внимательно проверял.

AG>
AG>На выделенное выше ты тратил огромное время (с точки зрения программного процесса).
AG>Уточню — время основного, или как ещё называют интерфейсного потока выполнения — aka main-thread.
AG>А что же в это время делел, например рабочий поток (aka worker-thread), о котором ты забыл во время отладки?
AG>Может этот worker-thread, не найдя свежих данных (из-за задержки main-thread), грохнулся об nullptr?


Вообще я сам никаких потоков не создавал. А если Qt само там что-то создало, то как мне до туда добраться и что мне там делать?


AG>В наших разработках — такое, ну или что-то подобное бывает нередко.

AG>Вот тут на помощь приходит отладка логированием, тот же spdlog.

AG>Тогда, логируюя переменные головного (main-thread) и вспомогательного (worker-thread) потоков,

AG>выясняем эту проблему и, например, чиним синхронизацию потоков, чтобы worker-thread коррктно ждал.

Ну нету у меня никаких воркер тредов.

И логгированием я нормально умею отлаживаться, на STM32 это основной способ. Только тут
Маньяк Робокряк колесит по городу
Re[8]: Докладываю
От: AlexGin Беларусь  
Дата: 16.09.21 10:04
Оценка:
Здравствуйте, Marty, Вы писали:

M>Мне было лень, и я отказался от QWT



M>Или ты прям не прочь в самих моих сорцах поковыряться? Вечерком скину, ок


Скорее всего — сильно ковыряться не буду. Но иногда — свежий взгляд помогает.

M>Вообще я сам никаких потоков не создавал. А если Qt само там что-то создало, то как мне до туда добраться и что мне там делать?


Пример с multi-threading я выбрал, как один из ярких примеров, когда удобна отладка логами.
Понятно, что этот пример совсем не единственный.

M>Ну нету у меня никаких воркер тредов.


Так тогда тем более интересно разобраться!
Почему же падаем? В чём причина проблемы?
Попутно замечу, что лично мне нравиться решать такие вот софтверные головоломки

M>И логгированием я нормально умею отлаживаться, на STM32 это основной способ.

+100500
Совершенно верно!
Когда отлаживаем ПО для устройства — это также весьма актуально.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.