Spec-Zone.ru › Qt

Qt Обработка данных визуализации данных

Ряды

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

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

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

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

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

Spec-Zone.ru

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