Qt開發技術:Q3D圖表開發筆記(一):Q3DScatter三維散點圖介紹、Demo以及代碼詳解

前言

  qt提供了q3d進行三維開發,雖然這個框架沒有得到大量運用也不是那麼成功,性能上也有很大的欠缺,但是普通的點到爲止的應用展示還是可以的。
  其中就包括華麗絢爛的三維圖表,數據量不大的時候是可以使用的。

 

Demo:Q3DScatter散點圖演示效果

  在這裏插入圖片描述
   在這裏插入圖片描述
  在這裏插入圖片描述

 

Q3D提供的三維圖表

  依賴QtDataVisualization。在安裝qt的時候要選擇安裝QtDataVisualization模塊。

Q3DScatter散點圖

  Q3D的散點圖,性能大約支撐1000個點可以不卡頓,具體依賴pc,1000個點是什麼 概念,可以理解爲:10x10x10的區域,每個區域一個數據點。
  在這裏插入圖片描述

Q3DBars柱狀圖

  Q3D的柱狀圖,性能跟散點圖類似。
  在這裏插入圖片描述

Q3DSurface平面凹凸圖,平面紋理圖

  Q3D的柱狀圖,性能跟散點圖類似。
  在這裏插入圖片描述

 

Q3DScatter散點圖

簡介

  Q3DScatter類提供了渲染3D散點圖的方法。能夠在3D中渲染散點圖,並通過自由旋轉場景來查看散點圖。
  旋轉是通過按住鼠標右鍵並移動鼠標來完成的。縮放由鼠標滾輪完成。如果啓用,則通過鼠標左鍵進行選擇。通過單擊鼠標滾輪,可以將場景重置爲默認攝影機視圖。在觸摸設備中,旋轉是通過點擊和移動完成的,選擇是通過點擊並按住並縮放。
  如果沒有設置軸,將創建沒有標籤的臨時默認軸。這些默認軸可以通過軸訪問器進行修改,但是一旦爲方向明確設置了任何軸,該方向的默認軸就會被破壞。
  Q3DScatter支持同時顯示多個系列。

構造最小Q3DS散點圖

  首先,構建Q3DS散射器。由於在本例中我們將圖形作爲頂級窗口運行,因此需要清除Qt::FramelessWindowHint標誌,該標誌默認設置爲:

Q3DScatter scatter;
scatter.setFlags(scatter.flags() ^ Qt::FramelessWindowHint);

  現在Q3DScatter已準備好接收要渲染的數據。添加一系列3個QVector3D項目:

QScatter3DSeries *series = new QScatter3DSeries;
QScatterDataArray data;
data << QVector3D(0.5f, 0.5f, 0.5f) << QVector3D(-0.3f, -0.5f, -0.4f) << QVector3D(0.0f, -0.3f, 0.2f);
series->dataProxy()->addItems(data);
scatter.addSeries(series);

  最後,將其設置爲可見:

scatter.show();

  創建和顯示此圖形所需的完整代碼是:

#include <QtDataVisualization>

using namespace QtDataVisualization;

int main(int argc, char **argv)
{
    QGuiApplication app(argc, argv);

    Q3DScatter scatter;
    scatter.setFlags(scatter.flags() ^ Qt::FramelessWindowHint);
    QScatter3DSeries *series = new QScatter3DSeries;
    QScatterDataArray data;
data << QVector3D(0.5f, 0.5f, 0.5f) 
            << QVector3D(-0.3f, -0.5f, -0.4f)
            << QVector3D(0.0f, -0.3f, 0.2f);
    series->dataProxy()->addItems(data);
    scatter.addSeries(series);
    scatter.show();

    return app.exec();
}

  運行效果:
  在這裏插入圖片描述
  場景可以被旋轉、放大,並且可以選擇一個項目來查看其位置,但在這個最小的代碼示例中不包括其他交互。通過熟悉所提供的示例(如散點示例)來了解更多信息。

 

Q3Ddemo構建流程解析

步驟一:確認安裝QtDataVisualization模塊

  如何確認,則是在幫助文件中查看是否有Q3dscatter類。一般是安裝了模塊纔會有對應的幫助文件。沒有則重新安裝qt或者單獨安裝該模塊。
  在這裏插入圖片描述

步驟二:工程配置文件中加入模塊

  Q3d是在數據可視化模塊中,需要在pro或者pri配置文件中添加。

QT += datavisualization

  在這裏插入圖片描述

步驟三:添加使用到的頭文件

  使用到Q3DScatter相關類中添加頭文件,主要使用到Q3DScatter和QScatter3DSeries等等。

#include <Q3DScatter>
#include <Q3DTheme>
#include <QScatter3DSeries>
#include <QVector3D>

  在這裏插入圖片描述

步驟四:添加命名空間

  這時候還是無法使用對應的類,需要添加命名空間纔行,查看最後“入坑一”:

using namespace QtDataVisualization;

  在這裏插入圖片描述

步驟五:Q3D的圖標基礎構建框架

  下面是包含註釋的Q3DScatter基礎構建流程,其他兩種圖類似:

_pQ3DScatter = new Q3DScatter();
_pContainer = QWidget::createWindowContainer(_pQ3DScatter, this);

// 設置軸文本
{
    _pQ3DScatter->axisX()->setTitle("X");
    _pQ3DScatter->axisY()->setTitle("Y");
    _pQ3DScatter->axisZ()->setTitle("Z");
}
// 設置軸範圍
{
//        _pQ3DScatter->axisX()->setRange(0, 10);
//        _pQ3DScatter->axisY()->setRange(0, 10);
//        _pQ3DScatter->axisZ()->setRange(0, 10);
}

// 生成一個曲線
_pScatter3DSeries = new QScatter3DSeries(_pQ3DScatter);
// 設置渲染平滑
_pScatter3DSeries->setMeshSmooth(true);

// 視圖添加該曲線
_pQ3DScatter->addSeries(_pScatter3DSeries);

// 設置陰影質量
_pQ3DScatter->setShadowQuality(QAbstract3DGraph::ShadowQualitySoftLow);
// 設置視角
_pQ3DScatter->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetIsometricLeft);
// 設置子網格
_pQ3DScatter->activeTheme()->setGridEnabled(true);

#if 1
// 添加模擬數據
QScatterDataArray data;
data << QVector3D(1, 1,1) << QVector3D(1, 1, 2) << QVector3D(1, 1, 3)
     << QVector3D(1, 2,1) << QVector3D(1, 2, 2) << QVector3D(1, 2, 3)
     << QVector3D(1, 3,1) << QVector3D(1, 3, 2) << QVector3D(1, 3, 3);
// 添加數據(自動沖掉之前的數據)
_pScatter3DSeries->dataProxy()->addItems(data);
#endif

#if 1
// 模擬
QList<QVector3D> listVector3D;
#if 0
listVector3D <<  QVector3D(5, 1,1) << QVector3D(5, 1, 2) << QVector3D
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章