Spec-Zone.ru › Qt 6.1

Обработка данных 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() и QList::resize() по возможности, чтобы избежать ненужных перераспределений при построении массива, который нужно передать прокси. Если вам нужно изменить весь набор данных для каждого кадра, в большинстве случаев лучше повторно использовать существующий массив, особенно если размер массива не меняется. Если вам нужно добавить, вставить, удалить или изменить несколько строк или элементов для каждого кадра, всегда более эффективно выполнить это одной операцией вместо нескольких операций, влияющих на одну строку или элемент.

Рендеринг столбцов оптимизирован для доступа только к данным, которые находятся в окне данных, и поэтому не должен замедляться даже при постоянном добавлении большего количества данных в прокси.

Из-за неупорядоченного характера данных рассеяния любые изменения диапазонов окна данных требуют проверки всех точек данных на видимость, что может привести к возрастающему замедлению при постоянном добавлении данных в прокси. Для наилучшей производительности с диаграммами рассеяния сохраняйте только необходимые данные в прокси.

Данные поверхности, хотя на уровне элементов похожи на данные рассеяния, уже распределены по строкам и столбцам, поэтому рендерер поверхности может оптимизировать отрисовку, предполагая, что данные в строках и столбцах упорядочены вдоль соответствующих осей. Это не так эффективно, как в случае столбцов, но почти так же.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.1/qtdatavisualization-data-handling.html

Spec-Zone.ru

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