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 は1つの小節値を保持する。QBarDataArray とQBarDataRow コンテナには、追加の型定義が用意されている。
このコード・スニペットは、データが仮想の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);
注意: シリーズオブジェクトは、一度に一つのプロキシしか所有できません。シリーズに別のプロキシが設定されると、既存のプロキシは削除されます。グラフは複数の系列を含むことができます。2つの異なるデータセット間を行ったり来たりする必要がある場合、通常、切り替える必要があるたびにプロキシを使用してシリーズ内のデータをリセットするよりも、各セットを異なるシリーズに格納し、シリーズを変更するだけの方が効率的です。
項目モデルとデータマッピング
一般的なユースケースに対して、Qt Graphs は特別なプロキシを提供しています。そのようなケースの1つは、アイテムモデル(QAbstractItemModel サブクラス)にデータを持つことです。これは、Qtアプリケーションでデータを格納する一般的な方法です。グラフの各タイプは、この目的のために特別なプロキシ・クラスを提供しています。例えば、QBar3DSeries のプロキシはQItemModelBarDataProxy です。これらのプロキシの使い方は簡単で、データを含むアイテムモデルへのポインタを与え、基本プロキシが処理できる形式にデータをマッピングするルールを指定します。
マッピングはアイテム・モデルのロールで動作します。モデル内の各データ項目は、ロールごとに異なる値を持つことができます。例えば、QItemModelBarDataProxy では、項目がどの行に属するかを決定するためにどのロールが使用され、どのロールが列に対して同じことを行い、どのロールが項目の値を指定するかを指定することができます。プロキシがモデルからデータを解決するとき、これらのマッピングを使用して棒グラフの行と列を生成します。
多くの場合、項目モデルは、複数の値にマッピングしたい情報を含む単一のロールを持ちます。この典型的な例は、2 つの時間関連軸 (例えば、年と月) を持つ棒グラフを生成するときのタイムスタンプ・フィールドです。1つの項目モデル・ロールを複数のデータ・フィールドにマッピングできるように、項目モデル・プロキシはパターン・マッチと置換のメカニズムを実装する必要があります。また、1対1のマッピングの場合でも、このメカニズムを使用してデータを再フォーマットすることができます。
グラフのタイプによっては、プロキシはQAbstractItemModel の行と列を棒グラフの行と列に直接マッピングするQItemModelBarDataProxy オプションのような他の機能もサポートするかもしれません。
プロキシの使い方や例については、個々のプロキシクラスを参照してください:QItemModelBarDataProxy QItemModelScatterDataProxy およびQItemModelSurfaceDataProxy を参照してください。
その他のカスタムプロキシ
QHeightMapSurfaceDataProxy は、ハイトマップ画像からサーフェスグラフを生成するための特殊なプロキシです。詳細は のドキュメントを参照してください。QHeightMapSurfaceDataProxy
Bar Graph タブにあるグラフギャラリーの例では、カスタムプロキシがどのように作成できるかを示しています。これはバリアントリストに基づいたカスタムデータセットと、関連するマッパーでそのデータを解決する基本プロキシの拡張を定義します。
リアルタイムデータの扱い
急速に更新されるデータセットがある場合、良いパフォーマンスを保証するためにデータを適切に扱うことが重要です。メモリの割り当てはコストのかかる操作なので、プロキシに渡す 配列を構築するときに不必要な再割り当てを避けるために、可能な限りQList::reserve() とQList::resize() を常に使用する。
必要な場合
- 各フレームのデータセット全体を変更する必要がある場合、ほとんどの場合、既存の配列を再利用するのが最善です。
- 各フレームに対して複数の行や項目を追加、挿入、削除、または変更する場合、1 つの行や項目に影響する複数のメソッドをコールするよりも、1 つのメソッドをコールする方が常に効率的です。たとえば、QBarDataProxy::addRows() を 10 回コールして 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.