本文借鉴自qt5.9c++开发指南,我只想用作记录。
看下代码:
需要在pro文件中导入:QT += datavisualization
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QtDataVisualization>
#include <QLineEdit>
#include <QComboBox>
#include <QSlider>
#include <QSpinBox>
#include <Q3DBars>
#include <QAbstract3DGraph>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
void InitGraph3D();
private:
QtDataVisualization::Q3DBars *graph3D=nullptr; //三维图表
QtDataVisualization::QBar3DSeries *series=nullptr; //序列
QtDataVisualization::QHeightMapSurfaceDataProxy *proxy=nullptr; //数据代理
QtDataVisualization::Q3DSurface *graph3DSurface=nullptr;
QtDataVisualization::QSurface3DSeries *seriesSurface=nullptr;
QWidget *centerWgt=nullptr;
bool m_bClick=false;
QPoint m_Point;
int m_Zoom=100;
};
#endif // WIDGET_H
#include "widget.h"
#include <QVBoxLayout>
#include <QMouseEvent>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
this->resize(800,600);
InitGraph3D();
QVBoxLayout *mainLayout=new QVBoxLayout(this);
mainLayout->addWidget(centerWgt);
mainLayout->setMargin(0);
this->setLayout(mainLayout);
}
Widget::~Widget()
{
}
void Widget::InitGraph3D()
{
//三维柱状图
/*
graph3D=new QtDataVisualization::Q3DBars();
centerWgt=QWidget::createWindowContainer(graph3D);
QStringList rowLabels,colLabels;
rowLabels<<QString("row1")<<QString("row2")<<QString("row3");
colLabels<<QString("col1")<<QString("col2")<<QString("col3");
QtDataVisualization::QValue3DAxis *axisV=new QtDataVisualization::QValue3DAxis();
axisV->setTitle("value");
axisV->setTitleVisible(true);
QtDataVisualization::QCategory3DAxis *axisCol=new QtDataVisualization::QCategory3DAxis();
axisCol->setTitle("rowAxis");
axisCol->setLabels(colLabels);
axisCol->setTitleVisible(true);
QtDataVisualization::QCategory3DAxis *axisRow=new QtDataVisualization::QCategory3DAxis();
axisRow->setTitle("colAxis");
axisRow->setLabels(rowLabels);
axisRow->setTitleVisible(true);
graph3D->setValueAxis(axisV);
graph3D->setColumnAxis(axisCol);
graph3D->setRowAxis(axisRow);
series=new QtDataVisualization::QBar3DSeries();
series->setMesh(QtDataVisualization::QAbstract3DSeries::MeshCylinder); //形状
series->setItemLabelFormat("(@rowLabel,@colLabel):%.1f");
graph3D->addSeries(series);
QtDataVisualization::QBarDataArray *dataSet=new QtDataVisualization::QBarDataArray;
dataSet->reserve(rowLabels.count());
QtDataVisualization::QBarDataRow *dataRow=new QtDataVisualization::QBarDataRow;
*dataRow<<1<<2<<3;
dataSet->append(dataRow);
QtDataVisualization::QBarDataRow *dataRow2=new QtDataVisualization::QBarDataRow;
*dataRow2<<5<<5<<5;
dataSet->append(dataRow2);
series->dataProxy()->resetArray(dataSet);
*/
graph3DSurface=new QtDataVisualization::Q3DSurface();
centerWgt=QWidget::createWindowContainer(graph3DSurface);
QtDataVisualization::QValue3DAxis *axisX=new QtDataVisualization::QValue3DAxis;
axisX->setTitle("East--West");
axisX->setTitleVisible(true);
axisX->setLabelFormat("%.1f Meter");
axisX->setRange(-5000,5000);
graph3DSurface->setAxisX(axisX);
QtDataVisualization::QValue3DAxis *axisY=new QtDataVisualization::QValue3DAxis;
axisY->setTitle("Degree");
axisY->setTitleVisible(true);
axisY->setAutoAdjustRange(true);
graph3DSurface->setAxisY(axisY);
QtDataVisualization::QValue3DAxis *axisZ=new QtDataVisualization::QValue3DAxis;
axisZ->setTitle("South--North");
axisZ->setTitleVisible(true);
axisZ->setLabelFormat("%.1f Meter");
axisZ->setRange(-5000,5000);
graph3DSurface->setAxisZ(axisZ);
graph3DSurface->activeTheme()->setLabelBackgroundEnabled(false);
QImage headImg("C:/Users/dujia/Desktop/aaa.tif");
proxy=new QtDataVisualization::QHeightMapSurfaceDataProxy(headImg);
proxy->setValueRanges(-5000,5000,-5000,5000);
seriesSurface=new QtDataVisualization::QSurface3DSeries(proxy);
seriesSurface->setItemLabelFormat("(@xLabel,@zLabel):@yLabel");
seriesSurface->setFlatShadingEnabled(false);
seriesSurface->setMeshSmooth(true);
seriesSurface->setDrawMode(QtDataVisualization::QSurface3DSeries::DrawSurface);
graph3DSurface->addSeries(seriesSurface);
}
这里需要一张高程图片,没有的key自己去网上下载。
效果图: