Spec-Zone.ru › Qt 5.11

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

Spec-Zone.ru

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