Как заставить QChartView рисовать только часть себя

Я создаю приложение, которое отображает данные измерений с использованием библиотеки QtCharts. Некоторые важные вещи, которые следует упомянуть:

  1. Я имею дело с временными рядами.

  2. Данные измерений получены в автономном режиме, что означает, что они уже были получены. Моя программа просто читает его из файла и отображает его.

  3. Я работаю с циклом for, который принимает точки данных как куски фиксированного размера (скажем, 10000) и добавляет их в ряд разброса. Таким образом, данные «воспроизводятся», и пользователь может видеть ход данных измерений во многих промежуточных временных точках, а не только после того, как все точки данных были нанесены на график.

  4. Я работаю с целым рядом точек данных, порядка миллионов.

На каждой итерации цикла создается новый QScatterSeries, добавляются точки данных, серии разброса добавляются к диаграмме, а затем перерисовывается представление диаграммы. В начале это довольно быстро, но с течением времени количество точек для рисования увеличивается, и процесс рисования становится все медленнее и медленнее.
Я точно знаю, что могу переопределить paintEvent класса представления диаграммы, чтобы заставить его перерисовывать только часть себя. Я думаю, что я могу сделать это быстрее, обновляя только те части, которые имеют новые точки данных. Я просто вычислю координаты региона, где были добавлены новые точки данных, и использую paintEvent. Но как мне это сделать? Я пытался использовать метод setClipRect () QPainter, но не смог этого сделать. Заранее спасибо.

0

Решение

QGraphicsView/QGraphicsItem не реализуй это.

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

Увы, в любом нетривиальном средстве просмотра сцены отношение между единицами горизонтального устройства (виджета) и единицами элемента (диаграммы / серии) не равно 1: 1, поэтому нет общего способа прокрутки данных в единицах устройства и их получения. все еще имеет смысл в единицах диаграммы.

Существует обходной путь: прокрутите на какое-то большее, чем нужно (округленное) количество единиц устройства, затем вычислите обратно, какую прокрутку он дает в единицах диаграммы, а затем сместите диаграмму на такое число (т.е. переместите ось X). диапазон соответственно).

Это можно было бы относительно легко реализовать в источниках QGraphicsView система, как диаграмма строится на нем. Нет никакого способа «прикрутить это» внешне — вам нужно добавить такую ​​поддержку непосредственно QGraphicsView а также QGraphicsItem инфраструктуры, а затем иметь QChartView использовать это. Если у вас нет привычки создавать свой собственный Qt, вы, конечно, можете скопировать необходимые классы в свою кодовую базу и переименовать их.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]