Spec-Zone.ru › Qt 5.15

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

Spec-Zone.ru

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