Russian Qt Forum
Ноябрь 24, 2024, 02:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вот такая задача - поделитесь опытом  (Прочитано 7446 раз)
once_again_abc
Гость
« : Август 18, 2011, 15:13 »


Есть некое устройство, генерящее поток (скажем 30000 значений в секунду) однородных данных в некотором диапазоне (например [-10:+10]).
Есть некое Qt приложение, которое должно принимать этот поток данных и отрисовывать их в виде графиков (на одном виджете в одной системе координат).
Обязательно нужно динамическое масштабирование картинки.
Чрезвычайно важна точность рисования/разрешение - при этом нужно как-то найти компромисс с производительностью т.к. еще _очень_ важна максимально возможная скорость отрисовки для точной и своевременной реакции пользователя на события.
Очень нужна возможность выделять регион и увеличивать/уменьшать его масштаб с соответствующей детализацией выделенных участк(-а-)ов графика.

С Qt я почти не знаком, изучаю его пару недель. Т.е. мне по идее все равно, что сейчас изучать с нуля - Qt QPainter, etc. или QWT и соответствующие классы либо вообще что-то другое, что можно использовать внутри Qt (для кросс-платформенности).

И еще важный момент - мне необходимо предоставить первую работающую версию в кратчайшие сроки.


Вопросы следующие:

1. Какой наиболее подходящий инструмент для решения такой задачи вообще, в принципе (в контексте Qt)?
2. Какое может быть наиболее адекватное решение в моей конкретной ситуации (упрощенно - что делать, куда бежать)?

Спасибо!
Записан
once_again_abc
Гость
« Ответ #1 : Август 18, 2011, 15:43 »

еще нашел вот эти библиотеки:

http://plplot.sourceforge.net/
и
http://mathgl.sourceforge.net/

также работают с Qt.

Очень нуждаюсь в советах тех, кто уже решал подобные задачи, неважно - успешно или нет.
Записан
gavlig
Гость
« Ответ #2 : Август 18, 2011, 23:07 »

Сам сейчас мучаюсь с максимально оптимальной отрисовкой. Посоветовали QGraphicsView, подробно почитать можно в assistant в статье Graphics View Framework. Только вот предупреждаю, что если сцену надо часто скроллить, этот фреймворк неиллюзорно грузит проц, вне зависимости от того, кто отрисовывает вьюпорт - опенгл или нет.
Записан
once_again_abc
Гость
« Ответ #3 : Август 19, 2011, 01:06 »

странно, что бывалые молчат =)
Записан
Prm
Гость
« Ответ #4 : Август 19, 2011, 06:59 »

Смотрите в сторону Qwt. Вроде достаточно шустро работает. Плюс имеет весь интересующий функционал(увеличение, выделение области).
Записан
Sancho_s_rancho
Гость
« Ответ #5 : Август 19, 2011, 09:34 »

Я в бывалые записываться не буду, но отвечу.
Средний монитор имеет ширину от 1000 до 2000 точек. Соответственно вам хочется ежесекундно обновлять от 15 до 30 графиков на всю ширину экрана. А приступ эпилепсии не начнется? И еще надо какая-то точность. Судя по всему за монитором будет сидеть супермен. Скорее всего задача поставлена неверно.
И второе. НЕ ИСПОЛЬЗУЙТЕ QGraphicsView для такого рода задач. Он предназначен для графики, а не для графиков. Производительность просядет, а код станет только сложнее.
Записан
Sancho_s_rancho
Гость
« Ответ #6 : Август 19, 2011, 09:40 »


Вопросы следующие:

1. Какой наиболее подходящий инструмент для решения такой задачи вообще, в принципе (в контексте Qt)?
2. Какое может быть наиболее адекватное решение в моей конкретной ситуации (упрощенно - что делать, куда бежать)?

Спасибо!
1. С QPainter буде все проще и гибче.
2. Изучить Qt и написать виджет самостоятельно. Если проект развивать не планируется, то можно взять чтото готовое, типа qwt. Ну или заплатить мне и я все сделаю.
Записан
gavlig
Гость
« Ответ #7 : Август 19, 2011, 11:23 »

Я в бывалые записываться не буду, но отвечу.
Средний монитор имеет ширину от 1000 до 2000 точек. Соответственно вам хочется ежесекундно обновлять от 15 до 30 графиков на всю ширину экрана. А приступ эпилепсии не начнется? И еще надо какая-то точность. Судя по всему за монитором будет сидеть супермен. Скорее всего задача поставлена неверно.
И второе. НЕ ИСПОЛЬЗУЙТЕ QGraphicsView для такого рода задач. Он предназначен для графики, а не для графиков. Производительность просядет, а код станет только сложнее.

Скажите, пожалуйста, если не секрет, что лучше использовать для динамической отрисовки? QPainter - единственный вариант(в рамках Qt, естественно) или есть другие альтернативы?
Записан
Sancho_s_rancho
Гость
« Ответ #8 : Август 19, 2011, 11:38 »

Если речь идет о графиках, то QPainter.
Если что-то типа casual game (не знаю, как это у геймеров по-русски называется) или заковыристого интерфейса пользователя, то  или Graphics Framework или qml. QML при желании можно сдобрить С++ и QPainter. Там все органично связывается. В общем, зависит от задачи.
« Последнее редактирование: Август 19, 2011, 11:40 от Sancho_s_rancho » Записан
Странник
Гость
« Ответ #9 : Август 19, 2011, 14:40 »

на заре своей Qt-карьеры решал подобную задачу (прием данных из COM-порта с детекцией ошибок и цифровой фильтрацией + визуализация на нескольких графиках в реальном времени с возможностью масштабирования, в том числе автоматического подбора оптимального масштаба и шага сетки). приличных готовых решений тогда не нашел, реализовал на QPainter - с производительностью проблем не было, частота входного сигнала правда была порядка на три поменьше = ) времени на все ушло две недели, с Qt до этого всерьез не сталкивался.

если решитесь писать сами - посмотрите пример plotter из главы 5 книги Бланшета и Саммерфилда "Qt 4 программирование GUI на C++", местами похоже на вашу задачу. исходники примера во вложении.
« Последнее редактирование: Август 19, 2011, 14:42 от Странник » Записан
once_again_abc
Гость
« Ответ #10 : Август 20, 2011, 03:11 »

ОГРОМНЕЙШЕЕ ВАМ всем спасибо за советы!

проект сложный и расчитан на несколько лет. будет развиваться и расширяться. задачу я здесь описал несколько упрощенно, на самом деле все несколько сложнее. но на данном этапе такое приближение вполне для нас достаточно.
делать все это нужно мне самому, так что мне предстоит расти вместе с проектом и знаниями о Qt и в частности о графике в Qt.
соответственно будут глупые вопросы, но постараюсь не надоедать слишком сильно =)

Спасибо!
Записан
gavlig
Гость
« Ответ #11 : Август 20, 2011, 10:50 »

Вам бы какой-нибудь блог завести и по мере развития проекта рассказывать нам о достигнутом. Мне было бы очень интересно Улыбающийся
Записан
once_again_abc
Гость
« Ответ #12 : Август 22, 2011, 01:55 »

Вам бы какой-нибудь блог завести и по мере развития проекта рассказывать нам о достигнутом. Мне было бы очень интересно Улыбающийся

честно признаюсь, я ленивый в этом отношении. но я подумаю =)
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #13 : Август 22, 2011, 12:37 »

Ежели не будет задействован OpenGL, то нужно иметь в виду, что отрисовка ломаных линий с большим количеством точек со сглаживанием под виндой будет очень сильно тормозить.
Записан

Qt 5.11/4.8.7 (X11/Win)
once_again_abc
Гость
« Ответ #14 : Сентябрь 27, 2011, 16:29 »

еще раз хочу сказать спасибо за советы.
выбранный мною путь оказался верным. задача блестяще решена. никаких тормозов, точность максимально возможная (вплоть до одного сэмпла сигнала). 32 канала прекрасно отрисовываются на максимальном разрешении с сэмплингом данных до 250000/сек. работает масштабирование, перемещение вдоль "свипа", зум...
если кто-то будет реализовывать подобную задачу, рекомендую использовать QImage + QPainter + QThread. производительность просто аццкая. достаточно даже drawPolyline на 32 массива точек.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.057 секунд. Запросов: 22.