Обработка данных 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.9/qtdatavisualization-data-handling.html