Qt Graphs 3D를 활용한 데이터 처리
시리즈
시리즈는 논리적으로 연결된 데이터 항목 집합과, 항목 메쉬나 색상 등 데이터 항목이 어떻게 렌더링되어야 하는지를 설명하는 시각적 속성을 결합한 것입니다. 각 그래프 유형에는 고유한 시리즈 유형이 있습니다. 예를 들어, 막대 그래프는 QBar3DSeries 를 사용합니다. 모든 그래프에는 여러 시리즈를 동시에 추가할 수 있습니다. 각 시리즈는 자체 데이터를 소유합니다.
다음 코드 예제는 ` QBar3DSeries `를 사용하여 막대를 원통 모양으로 렌더링하고, 단색 대신 그라데이션 효과를 적용하는 방법을 보여줍니다:
QQuickWidget quickWidget;
Q3DBarsWidgetItem graph;
graph.setWidget(&quickWidget);
QBar3DSeries series;
QLinearGradient barGradient(0, 0, 1, 100);
barGradient.setColorAt(1.0, Qt::white);
barGradient.setColorAt(0.0, Qt::black);
series.setBaseGradient(barGradient);
series.setColorStyle(QGraphsTheme::ColorStyle::ObjectGradient);
series.setMesh(QAbstract3DSeries::Mesh::Cylinder);
graph.addSeries(&series);데이터 프록시
사용자가 시각화하고자 하는 데이터는 다양한 형식으로 제공되지만, 모든 형식을 직접 지원할 수는 없습니다. 따라서 ` Qt Graphs `는 데이터 프록시를 구현하여, 사용자가 알려진 형식으로 데이터를 입력할 수 있도록 합니다. 각 그래프의 시리즈에는 해당 그래프에 적합한 형식의 데이터를 받아들이는 기본 프록시 유형이 있습니다. 프록시와 시리즈의 관계에서, 데이터가 시리즈에 저장되므로 몇 가지 사항을 언급하는 것이 중요합니다. 첫째, 이 구현 방식을 통해 사용자는 시계를 통해 데이터에 접근할 수 있습니다. 사용자가 이 데이터에 대해 추가나 삭제와 같은 작업을 수행하고자 할 경우, 프록시를 통해 이러한 작업을 수행할 수 있습니다. 그러나 이러한 작업을 수행하려면 해당 프록시와 연관된 시계를 생성해야 합니다.
예를 들어, QBar3DSeries 의 기본 프록시는 QBarDataProxy 이며, 이는 QBarDataItem 객체 형태로 시리즈에 데이터를 추가하는 데 사용됩니다. 각 QBarDataItem 는 단일 막대(bar) 값을 포함합니다. QBarDataArray 및 QBarDataRow 컨테이너를 위한 추가 typedef도 제공됩니다.
다음 코드 예제는 데이터가 가상의 ` myData ` 객체에 저장되어 있고, 이 객체가 데이터를 ` QBarDataItems` 형식으로 반환하는 경우 기본 프록시를 사용하는 방법을 보여줍니다:
QQuickWidget quickWidget;
Q3DBarsWidgetItem graph;
graph.setWidget(&quickWidget);
QBar3DSeries series;
for (int i = 0; i < 10; ++i) {
QBarDataRow dataRow;
for (int j = 0; j < 5; ++j)
dataRow.append(myData->getValue(i, j));
series.dataProxy()->addRow(dataRow);
}
graph.addSeries(&series);참고: Series 객체는 한 번에 하나의 프록시만 가질 수 있습니다. 시리즈에 다른 프록시가 설정되면 기존 프록시는 삭제됩니다. 하지만 그래프에는 여러 개의 시리즈를 포함할 수 있습니다. 두 개의 서로 다른 데이터 세트 간에 전환해야 하는 경우, 전환할 때마다 프록시를 사용하여 시리즈의 데이터를 재설정하는 것보다 각 세트를 서로 다른 시리즈에 저장하고 시리즈만 변경하는 것이 일반적으로 더 효율적입니다.
항목 모델 및 데이터 매핑
일반적인 사용 사례를 위해 Qt Graphs 은 특화된 프록시를 제공합니다. 그 중 하나는 Qt 애플리케이션에서 데이터를 저장하는 일반적인 방법인 아이템 모델(QAbstractItemModel 의 서브클래스)에 데이터를 보유하는 경우입니다. 그래프의 각 타입은 이러한 목적을 위해 특수한 프록시 클래스를 제공합니다. 예를 들어, QBar3DSeries 에 대한 QItemModelBarDataProxy 가 있습니다. 이러한 프록시는 사용법이 간단합니다. 데이터가 포함된 아이템 모델에 대한 포인터를 제공하고, 데이터를 기본 프록시가 처리할 수 있는 형식으로 매핑하는 규칙을 지정하기만 하면 됩니다.
매핑은 항목 모델의 역할(role)을 통해 이루어집니다. 모델 내의 각 데이터 항목은 역할에 따라 서로 다른 값을 가질 수 있습니다. 예를 들어, QItemModelBarDataProxy 를 사용하면, 항목이 속한 행을 결정하는 데 사용되는 역할, 열을 결정하는 데 사용되는 역할, 그리고 항목의 값을 지정하는 역할을 각각 지정할 수 있습니다. 프록시가 모델에서 데이터를解析할 때, 이러한 매핑을 사용하여 막대 그래프의 행과 열을 생성합니다.
종종 항목 모델에는 여러 값에 매핑하려는 정보를 포함하는 단일 역할이 있습니다. 이에 대한 전형적인 예로는, 연도와 월과 같은 두 개의 시간 관련 축을 가진 막대 그래프를 생성할 때의 타임스탬프 필드가 있습니다. 단일 항목 모델 역할을 하나 이상의 데이터 필드에 매핑할 수 있도록 하려면, 항목 모델 프록시는 패턴 매칭 및 대체 메커니즘을 구현해야 합니다. 또한 이 메커니즘을 사용하여 일대일 매핑의 경우에도 데이터 형식을 재구성할 수 있습니다.
그래프 유형에 따라 프록시는 다른 기능도 지원할 수 있습니다. 예를 들어, QItemModelBarDataProxy 를 통해 QAbstractItemModel 의 행과 열을 막대 그래프의 행과 열에 직접 매핑하는 등의 선택적 기능을 제공할 수 있습니다.
사용 방법에 대한 자세한 정보와 예제는 개별 프록시 클래스( QItemModelBarDataProxy, QItemModelScatterDataProxy, QItemModelSurfaceDataProxy)를 참조하십시오.
기타 사용자 정의 프록시
QHeightMapSurfaceDataProxy 는 높이맵 이미지에서 표면 그래프를 생성하기 위한 특화된 프록시입니다. 자세한 내용은 QHeightMapSurfaceDataProxy 문서를 참조하십시오.
' Bar Graph ' 탭에 있는 'Graph Gallery' 예제는 사용자 정의 프록시를 생성하는 방법을 보여줍니다. 이 예제는 변형 목록을 기반으로 사용자 정의 데이터 세트를 정의하고, 해당 데이터를 관련 매퍼와 연결하여 처리하도록 기본 프록시를 확장합니다.
실시간 데이터 처리
데이터 세트가 빠르게 업데이트되는 경우, 우수한 성능을 보장하기 위해 데이터를 적절히 처리하는 것이 중요합니다. 메모리 할당은 비용이 많이 드는 작업이므로, 프록시에 전달할 배열을 생성할 때 불필요한 재할당을 피하기 위해 가능한 한 항상 ` QList::reserve()` 및 ` QList::resize()`를 사용하십시오.
다음과 같은 경우:
- 각 프레임마다 전체 데이터 세트를 변경해야 하는 경우, 특히 배열의 차원이 변하지 않는다면 대부분의 경우 기존 배열을 재사용하는 것이 가장 좋습니다.
- 각 프레임마다 여러 행이나 항목을 추가, 삽입, 제거 또는 변경해야 하는 경우, 행이나 항목 하나씩을 처리하는 여러 번의 호출 대신 단일 메서드 호출로 처리하는 것이 항상 더 효율적입니다. 예를 들어, 단일 QBarDataProxy::addRows() 호출로 10개의 행을 추가하는 것이 QBarDataProxy::addRow() 호출을 10번 따로 수행하는 것보다 훨씬 더 효율적입니다.
Bars3D 는 데이터 윈도우 내에 있는 데이터에만 접근하도록 최적화되어 있으므로, 프록시를 사용하여 시퀀스에 더 많은 데이터가 지속적으로 추가되더라도 눈에 띄는 속도 저하는 발생하지 않습니다.
산점도 데이터는 정렬되지 않은 특성상, 데이터 윈도우 범위가 변경될 때마다 모든 데이터 포인트의 표시 여부를 확인해야 하므로, 프록시에 데이터가 지속적으로 추가될 경우 성능 저하가 점차 심해질 수 있습니다. 산점도 그래프에서 최상의 성능을 얻으려면 프록시에 필요한 데이터만 보관하십시오.
표면 데이터는 항목 수준에서는 산점도 데이터와 유사하지만, 이미 행과 열로 할당되어 있습니다. 따라서 표면 렌더러는 행과 열의 데이터가 각 축을 따라 정렬되어 있다고 가정함으로써 그리기 작업을 최적화할 수 있습니다. 막대 그래프의 경우만큼 효율적이지는 않지만, 거의 비슷한 수준입니다.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.