Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: ksanto от Март 03, 2011, 20:19



Название: Real time plotter
Отправлено: ksanto от Март 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?

Может быть существуют готовые виджеты для графиков, обновляющихся в реальном времени с высокой частотой?

Спасибо за внимание.


Название: Re: Real time plotter
Отправлено: xokc от Март 03, 2011, 21:53
250 мс - это 4 раза в секунду? Я бы на таких таймингах вообще о производительности думал бы на последних этапах - во всяком случае уж разницы между QPixmap и QImage тут не увидеть никак.


Название: Re: Real time plotter
Отправлено: ksanto от Март 03, 2011, 22:21
Да, 4Гц. Ну так в программе-то не только это делается, а еще много чего. И еще представьте, что, например, этих каналов 15 штук и максимальная длина 1200 секунд и это нужно постоянно отрисовывать в реальном времени без лагов.
Кроме того, хотелось для себя принципиально решить этот вопрос - как правильно и максимально производительно? В документации и различных статьях много чего написано.


Название: Re: Real time plotter
Отправлено: twp от Март 04, 2011, 11:56
Может быть существуют готовые виджеты для графиков, обновляющихся в реальном времени с высокой частотой?

QWT


Название: Re: Real time plotter
Отправлено: ksanto от Март 04, 2011, 12:59
Я уже смотрел на QWT, но не подходит он мне. Особенно для случая большого количества графиков.


Название: Re: Real time plotter
Отправлено: Akon от Март 04, 2011, 13:33
Не мог бы вкратце сказать, почему не подходит Qwt?


Название: Re: Real time plotter
Отправлено: GreatSnake от Март 04, 2011, 13:50
Цитировать
Что лучше использовать QImage или QPixmap для прорисовки и вывода на экран.
Если будете использовать composing (сглаживание или альфа-канал), то пользоваться только QImage, т.к. Qt композинг делает только с QImage.
Да и вообще, QPixmap нужно использовать только для статических картинок.


Название: Re: Real time plotter
Отправлено: ksanto от Март 04, 2011, 14:31
Не мог бы вкратце сказать, почему не подходит Qwt?
Все очень просто - там каждый график рисуется отдельно со своими осями, подписями и тп. А мне нужно чтобы они были совмещенными. Кроме того, API уже сделан и не так просто что-то изменить под себя, под конкретные цели. Да и ради этого вкомпилировать в свой проект в принципе немаленькую библиотеку не очень хочется. QWT достаточно мощная вещь и 95% ее у меня просто не будет использоваться, а при этом то, что мне нужно, придется все равно самому переписывать.


Название: Re: Real time plotter
Отправлено: Akon от Март 04, 2011, 15:00
ОК, спасибо за ответ.

Может, я несколько не понял? В Qwt также совмещаются графики. В одном плоте (QwtPlot) может быть несколько графиков (QwtPlotCurve), смотри вложение. Размер релизной длл-ки Qwt 5.2.0 ~ 700 кБ.

Просто сам испльзовал Qwt для отрисовки сигналов в реальном времени, но с частотами вплоть до десятков Герц. Около 90% ресурсов в моей программе потребляла Qwt-отрисовка. В конечном счете результат меня устроил.


Название: Re: Real time plotter
Отправлено: ksanto от Март 04, 2011, 15:11
Да, я знаю, что на одном их может быть много. Я библиотекой пользовался и разбирался в ней. Но мне нужно, чтобы их было параллельно около 15 штук один под другим, у каждого свои пределы по оси Y. При этом по оси X у всех одно и то же - время. Позволить при этом Qwt-отрисовке потреблять так много ресурсов я не могу.
Да, она, когда собрана, не такая уж и большая, но все же это сторонняя библиотека, которая почти не будет при этом использоваться.
Спасибо за предложенный вариант.