Spec-Zone.ru › Qt 5.14

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

Spec-Zone.ru

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