Обработка данных в Qt Data Visualization
Серии
Серия — это комбинация логически связанного набора элементов данных (обрабатываемых прокси данных) и визуальных свойств, описывающих, как должны отображаться элементы данных, такие как сетки элементов и цвета. Каждый тип визуализации имеет свой собственный тип серии. Например, столбчатые диаграммы используют QBar3DSeries. Все диаграммы могут иметь несколько добавленных одновременно серий.
Этот фрагмент кода демонстрирует, как использовать QBar3DSeries для отображения столбцов в виде цилиндров и с градиентом вместо однородного цвета:
Q3DBars graph; QBar3DSeries *series = new QBar3DSeries; QLinearGradient barGradient(0, 0, 1, 100); barGradient.setColorAt(1.0, Qt::white); barGradient.setColorAt(0.0, Qt::black); series->setBaseGradient(barGradient); series->setColorStyle(Q3DTheme::ColorStyleObjectGradient); series->setMesh(QAbstract3DSeries::MeshCylinder); graph->addSeries(series);
Прокси данных
Данные, которые пользователи хотят визуализировать, имеют множество форматов, не все из которых могут быть напрямую поддерживаемы. Поэтому Qt Data Visualization реализует прокси-серверы данных, в которые пользователи могут загружать свои данные в известном формате. Каждый тип визуализации имеет базовый тип прокси, который принимает данные в формате, подходящем для этой визуализации. Например, базовый прокси для QBar3DSeries — это QBarDataProxy, который хранит строки объектов QBarDataItem. Каждый QBarDataItem хранит одно значение столбца. Предоставляются дополнительные определения типов для QBarDataArray и QBarDataRow контейнеров.
Этот фрагмент кода демонстрирует, как использовать базовый прокси, когда ваши данные хранятся в некотором гипотетическом myData объекте:
Q3DBars graph;
QBarDataProxy *newProxy = new QBarDataProxy;
QBarDataArray *dataArray = new QBarDataArray;
dataArray->reserve(10);
for (int i = 0; i < 10; i++) {
QBarDataRow *dataRow = new QBarDataRow(5);
for (int j = 0; j < 5; j++)
(*dataRow)[j].setValue(myData->getValue(i, j));
dataArray->append(dataRow);
}
newProxy->resetArray(dataArray);
graph->addSeries(new QBar3DSeries(newProxy)); Примечание: Объекты серии могут владеть только одним прокси за раз. Существующий прокси удаляется, когда другой устанавливается в серию. Однако графики могут содержать несколько серий. Если вам нужно переключаться между двумя различными наборами данных, обычно более эффективно хранить каждый набор в отдельной серии и просто менять серии, а не сбрасывать данные в одном прокси каждый раз, когда вам нужно переключиться.
Модели элементов и сопоставление данных
Для распространенных случаев использования Qt Data Visualization предлагает специализированные прокси. Один из таких случаев — наличие данных в модели элементов (QAbstractItemModel подкласс), который является распространенным способом хранения данных в приложениях Qt. Каждый из типов визуализации предлагает специальный класс прокси для этой цели, например, QItemModelBarDataProxy для QBar3DSeries. Эти прокси просты в использовании: просто передайте им указатель на модель элементов, содержащую данные, и правила сопоставления данных в формат, который может обработать базовый прокси.
Сопоставление работает с ролями модели элементов. Каждый элемент данных в модели может иметь разные значения для разных ролей. Например, с помощью QItemModelBarDataProxy можно указать, какая роль используется для определения строки, к которой принадлежит элемент, какая роль делает то же самое для столбцов и какая роль определяет значение элемента. Когда прокси разрешает данные из модели, он использует эти сопоставления для генерации строк и столбцов столбчатой диаграммы.
Часто модели элементов имеют одну роль, которая содержит информацию, которую вы хотите сопоставить с несколькими значениями. Типичный пример — поле временной метки при построении столбчатой диаграммы с двумя связанными временем осями, например, годами и месяцами. Чтобы разрешить сопоставление одной роли модели элемента с более чем одним полем данных, прокси модели элементов предоставляют механизм сопоставления шаблонов и замены. Вы также можете использовать этот механизм для форматирования данных даже в однозначных случаях сопоставления.
В зависимости от типа визуализации прокси могут также поддерживать другие функции, например, QItemModelBarDataProxy необязательно сопоставляет строки и столбцы QAbstractItemModel непосредственно в строки и столбцы столбчатой диаграммы.
Дополнительную информацию и примеры использования см. в отдельных классах прокси: QItemModelBarDataProxy, QItemModelScatterDataProxy и QItemModelSurfaceDataProxy.
Другие пользовательские прокси
QHeightMapSurfaceDataProxy — это специализированный прокси для создания графика поверхности из изображения карты высот. Дополнительную информацию см. в документации QHeightMapSurfaceDataProxy.
Пример Пользовательский прокси демонстрирует, как создать пользовательский прокси. Он определяет пользовательский набор данных на основе списков вариантов и расширение базового прокси для разрешения этих данных с помощью связанного маппера.
Работа с данными в реальном времени
Когда у вас есть набор данных, который быстро обновляется, важно правильно обрабатывать данные, чтобы обеспечить хорошую производительность. Поскольку выделение памяти является дорогостоящей операцией, всегда используйте QList::reserve() и QVector::resize() по возможности, чтобы избежать ненужных перераспределений при построении массива для передачи прокси. Если вам нужно изменить весь набор данных для каждого кадра, в большинстве случаев лучше повторно использовать существующий массив — особенно если размер массива не изменяется. Если вам нужно добавить, вставить, удалить или изменить несколько строк или элементов для каждого кадра, всегда эффективнее сделать это одним вызовом метода вместо нескольких вызовов, влияющих на отдельную строку или элемент. Например, добавление десяти строк с помощью одного вызова QBarDataProxy::addRows() намного эффективнее, чем десять отдельных вызовов QBarDataProxy::addRow().
Рендерер столбцов оптимизирован для доступа только к данным, которые находятся в окне данных, и, следовательно, не должен испытывать заметного замедления даже если к прокси постоянно добавляются дополнительные данные.
Из-за неупорядоченного характера данных точек, любые изменения в диапазонах окна данных требуют проверки всех точек данных на видимость, что может привести к увеличению замедления, если данные постоянно добавляются к прокси. Для достижения наилучшей производительности с диаграммами точек, сохраняйте в прокси только необходимые данные.
Данные поверхности, хотя на уровне элементов аналогичны данным точек, уже распределены по строкам и столбцам, поэтому рендерер поверхности может оптимизировать отрисовку, предположив, что данные в строках и столбцах отсортированы вдоль соответствующих осей. Это не так эффективно, как в случае со столбцами, но почти так же.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.13/qtdatavisualization-data-handling.html