Qt グラフ 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 は、データ・ウィンドウ内にあるデータのみにアクセスするように最適化されているため、プロキシを使用してシリーズに継続的にデータが追加されても、顕著な速度低下は発生しないはずです。
スキャッターデータはソートされていないため、データウィンドウの範囲を変更すると、すべてのデータポイントの可視性をチェックする必要があります。散布図で最高のパフォーマンスを得るには、必要なデータだけをプロキシに保持してください。
サーフェスデータは、アイテムレベルでは散布図データに似ていますが、すでに行と列に割り当てられています。したがって、サーフェスレンダラは、行と列のデータがそれぞれの軸に沿ってソートされていると仮定することで、描画を最適化できます。棒グラフの場合ほど効率的ではありませんが、ほぼ同じです。
本書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。