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 은 단일 막대 값을 보유합니다. 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);
참고: 시리즈 객체는 한 번에 하나의 프록시만 소유할 수 있습니다. 다른 프록시가 계열로 설정되면 기존 프록시는 삭제됩니다. 하지만 그래프에는 여러 개의 계열을 포함할 수 있습니다. 서로 다른 두 데이터 세트 사이를 전환해야 하는 경우 전환해야 할 때마다 프록시를 사용하여 시리즈의 데이터를 재설정하는 것보다 각 세트를 다른 시리즈에 저장하고 시리즈만 변경하는 것이 일반적으로 더 효율적입니다.
항목 모델 및 데이터 매핑
일반적인 사용 사례의 경우 Qt Graphs 에서 특수 프록시를 제공합니다. 이러한 경우 중 하나는 Qt 애플리케이션에서 데이터를 저장하는 일반적인 방법인 항목 모델(QAbstractItemModel 서브클래스)에 데이터를 저장하는 것입니다. 그래프의 각 유형은 이러한 목적을 위한 특수 프록시 클래스를 제공합니다(예: QBar3DSeries 의 경우 QItemModelBarDataProxy ). 이러한 프록시는 사용이 간단합니다. 데이터를 포함하는 항목 모델에 대한 포인터를 제공하고 기본 프록시가 처리할 수 있는 형식으로 데이터를 매핑하는 방법에 대한 규칙을 지정하기만 하면 됩니다.
매핑은 항목 모델 역할과 함께 작동합니다. 모델의 각 데이터 항목은 역할에 따라 서로 다른 값을 가질 수 있습니다. 예를 들어 QItemModelBarDataProxy 를 사용하면 항목이 속한 행을 결정하는 데 사용되는 역할, 열에 대해 동일한 역할을 수행하는 역할, 항목의 값을 지정하는 역할을 지정할 수 있습니다. 프록시는 모델에서 데이터를 확인할 때 이러한 매핑을 사용하여 막대 그래프의 행과 열을 생성합니다.
항목 모델에는 여러 값에 매핑하려는 정보가 포함된 단일 역할이 있는 경우가 많습니다. 예를 들어 연도와 월 등 두 개의 시간 관련 축이 있는 막대 그래프를 생성할 때 타임스탬프 필드가 대표적인 예입니다. 단일 항목 모델 역할을 둘 이상의 데이터 필드에 매핑하려면 항목 모델 프록시가 패턴 일치 및 바꾸기 메커니즘을 구현해야 합니다. 일대일 매핑의 경우에도 이 메커니즘을 사용하여 데이터를 다시 포맷할 수 있습니다.
그래프 유형에 따라 프록시는 QItemModelBarDataProxy 행과 열을 막대 그래프 행과 열에 직접 매핑하는 것과 같은 다른 기능도 지원할 수 있습니다(예: QAbstractItemModel 선택적으로 행과 열을 막대 그래프 행과 열에 직접 매핑).
프록시 사용 방법에 대한 자세한 내용과 예제는 개별 프록시 클래스를 참조하세요: QItemModelBarDataProxy, QItemModelScatterDataProxy, QItemModelSurfaceDataProxy 을 참조하세요.
기타 사용자 정의 프록시
QHeightMapSurfaceDataProxy 는 하이트맵 이미지에서 서피스 그래프를 생성하기 위한 특수 프록시입니다. 자세한 내용은 QHeightMapSurfaceDataProxy 문서를 참조하세요.
Bar Graph 탭의 그래프 갤러리 예제에서는 사용자 지정 프록시를 만드는 방법을 보여줍니다. 여기에서는 변형 목록을 기반으로 사용자 정의 데이터 집합을 정의하고 기본 프록시의 확장을 통해 연결된 매퍼로 해당 데이터를 해결합니다.
실시간 데이터 처리하기
빠르게 업데이트되는 데이터 세트가 있는 경우 좋은 성능을 보장하려면 데이터를 적절하게 처리하는 것이 중요합니다. 메모리 할당은 비용이 많이 드는 작업이므로 프록시에 제공할 배열을 구성할 때 가능한 경우 항상 QList::reserve() 및 QList::resize()를 사용하여 불필요한 재할당을 피하세요.
필요한 경우
- 각 프레임의 전체 데이터 세트를 변경해야 하는 경우, 특히 배열 차원이 변경되지 않는 경우에는 기존 배열을 재사용하는 것이 가장 좋습니다.
- 각 프레임에 대해 여러 행 또는 항목을 추가, 삽입, 제거 또는 변경해야 하는 경우, 각각 하나의 행 또는 항목에 영향을 미치는 여러 호출 대신 한 번의 메서드 호출로 수행하는 것이 항상 더 효율적입니다. 예를 들어 QBarDataProxy::addRows() 호출 한 번으로 10개의 행을 추가하는 것이 QBarDataProxy::addRow() 호출 10개를 따로 하는 것보다 훨씬 더 효율적입니다.
Bars3D 는 데이터 창 내에 있는 데이터에만 액세스하도록 최적화되어 있으므로 프록시를 사용하여 시리즈에 더 많은 데이터를 계속 추가하더라도 눈에 띄는 속도 저하가 발생하지 않습니다.
분산형 데이터의 정렬되지 않은 특성으로 인해 데이터 창 범위가 변경되면 모든 데이터 포인트가 표시되는지 확인해야 하므로 프록시에 데이터가 계속 추가되면 속도가 느려질 수 있습니다. 분산형 그래프에서 최상의 성능을 얻으려면 필요한 데이터만 프록시에 보관하세요.
서피스 데이터는 분산형 데이터와 유사한 항목 수준에서 이미 행과 열로 할당되어 있습니다. 따라서 서피스 렌더러는 행과 열의 데이터가 각각의 축을 따라 정렬되어 있다고 가정하여 그리기를 최적화할 수 있습니다. 막대의 경우만큼 효율적이지는 않지만 거의 비슷합니다.
© 2025 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.