Russian Qt Forum
Ноябрь 24, 2024, 09:00
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Пользовательский интерфейс (GUI)
>
Real time plotter
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Real time plotter (Прочитано 6732 раз)
ksanto
Гость
Real time plotter
«
:
Март 03, 2011, 20:19 »
Есть задача: сделать виджет, который будет строить график, добавляя значения в реальном времени с периодом ~250мс. Причем задача может двух видов:
- один график с фиксированным временным интервалом - для просмотра переходных процессов под одному каналу.
- несколько параллельных графиков, расположенных друг под другом, где значения добавляются одновременно для всех. Временной отрезок может быть произвольной длины (конечно, ограничен максимальным значением).
Какие советы по его реализации можете предложить?
Мое видение реализации таково...
Прочитав документацию по QPainter и статьи на тему Qt Graphics and Performance, для себя решил, чтобы буду использовать графическую систему raster (QApplication::setGraphicsSystem). Реализовать сам график буду в виде двух объектов QImage или QPixmap. Один предполагается отрисовывать только один раз при инициализации объекта - подложка с осями и подписями (либо для одного графика фиксированной длины можно вообще загружать эту подложку в виде .png картинки - есть ли смысл?). Второй постоянно отрисовывать (или дорисовывать если это возможно) по приходу paintEvent (будет вызываться update() по поступлению новых данных). Далее накладывать второй на первый в режиме QPainter::CompositionMode_SourceOver (этот режим, как я понял, один из самых производительных).
Вопросы в следующем (не до конца понял из прочитанного)....
Что лучше использовать QImage или QPixmap для прорисовки и вывода на экран. Из документации следует, что быстрее графическая система работает для формата QImage::Format_ARGB32_Premultiplied (который задается для объектов QImage), НО выводить на экран быстрее функцией drawPixmap(), чем drawImage(). В случае использования QImage c drawPixmap(), потребуется конвертация в QPixmap. Насколько она дорого будет стоить и есть ли смысл таким образом реализовывать? Может проще drawPixmap()+QPixmap или drawImage() + QImage?
Может быть существуют готовые виджеты для графиков, обновляющихся в реальном времени с высокой частотой?
Спасибо за внимание.
Записан
xokc
Птица говорун
Offline
Сообщений: 976
Re: Real time plotter
«
Ответ #1 :
Март 03, 2011, 21:53 »
250 мс - это 4 раза в секунду? Я бы на таких таймингах вообще о производительности думал бы на последних этапах - во всяком случае уж разницы между QPixmap и QImage тут не увидеть никак.
Записан
ksanto
Гость
Re: Real time plotter
«
Ответ #2 :
Март 03, 2011, 22:21 »
Да, 4Гц. Ну так в программе-то не только это делается, а еще много чего. И еще представьте, что, например, этих каналов 15 штук и максимальная длина 1200 секунд и это нужно постоянно отрисовывать в реальном времени без лагов.
Кроме того, хотелось для себя принципиально решить этот вопрос - как правильно и максимально производительно? В документации и различных статьях много чего написано.
Записан
twp
Гость
Re: Real time plotter
«
Ответ #3 :
Март 04, 2011, 11:56 »
Цитата: ksanto от Март 03, 2011, 20:19
Может быть существуют готовые виджеты для графиков, обновляющихся в реальном времени с высокой частотой?
QWT
Записан
ksanto
Гость
Re: Real time plotter
«
Ответ #4 :
Март 04, 2011, 12:59 »
Я уже смотрел на QWT, но не подходит он мне. Особенно для случая большого количества графиков.
Записан
Akon
Гость
Re: Real time plotter
«
Ответ #5 :
Март 04, 2011, 13:33 »
Не мог бы вкратце сказать, почему не подходит Qwt?
Записан
GreatSnake
Джедай : наставник для всех
Offline
Сообщений: 2921
Re: Real time plotter
«
Ответ #6 :
Март 04, 2011, 13:50 »
Цитировать
Что лучше использовать QImage или QPixmap для прорисовки и вывода на экран.
Если будете использовать composing (сглаживание или альфа-канал), то пользоваться только QImage, т.к. Qt композинг делает только с QImage.
Да и вообще, QPixmap нужно использовать только для статических картинок.
Записан
Qt 5.11/4.8.7 (X11/Win)
ksanto
Гость
Re: Real time plotter
«
Ответ #7 :
Март 04, 2011, 14:31 »
Цитата: Akon от Март 04, 2011, 13:33
Не мог бы вкратце сказать, почему не подходит Qwt?
Все очень просто - там каждый график рисуется отдельно со своими осями, подписями и тп. А мне нужно чтобы они были совмещенными. Кроме того, API уже сделан и не так просто что-то изменить под себя, под конкретные цели. Да и ради этого вкомпилировать в свой проект в принципе немаленькую библиотеку не очень хочется. QWT достаточно мощная вещь и 95% ее у меня просто не будет использоваться, а при этом то, что мне нужно, придется все равно самому переписывать.
Записан
Akon
Гость
Re: Real time plotter
«
Ответ #8 :
Март 04, 2011, 15:00 »
ОК, спасибо за ответ.
Может, я несколько не понял? В Qwt также совмещаются графики. В одном плоте (QwtPlot) может быть несколько графиков (QwtPlotCurve), смотри вложение. Размер релизной длл-ки Qwt 5.2.0 ~ 700 кБ.
Просто сам испльзовал Qwt для отрисовки сигналов в реальном времени, но с частотами вплоть до десятков Герц. Около 90% ресурсов в моей программе потребляла Qwt-отрисовка. В конечном счете результат меня устроил.
Записан
ksanto
Гость
Re: Real time plotter
«
Ответ #9 :
Март 04, 2011, 15:11 »
Да, я знаю, что на одном их может быть много. Я библиотекой пользовался и разбирался в ней. Но мне нужно, чтобы их было параллельно около 15 штук один под другим, у каждого свои пределы по оси Y. При этом по оси X у всех одно и то же - время. Позволить при этом Qwt-отрисовке потреблять так много ресурсов я не могу.
Да, она, когда собрана, не такая уж и большая, но все же это сторонняя библиотека, которая почти не будет при этом использоваться.
Спасибо за предложенный вариант.
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...