Spec-Zone.ru › Qt 5.12

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API