展示效果图如下:
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
,AxisXMinValue(0)
,AxisXMaxValue(MAXSIZE)
,AxisYMinValue(0)
,AxisYMaxValue(MAXSIZE)
,AxisZMinValue(0)
,AxisZMaxValue(MAXSIZE)
, ui(new Ui::Widget)
{
ui->setupUi(this);
qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); //设置随机数种子
//垂直布局
m_main_layout = new QVBoxLayout();
setLayout(m_main_layout);
//QT数据可视化框架的三维散点图
m_scatter = new QtDataVisualization::Q3DScatter(nullptr);
m_scatter->setShadowQuality(QtDataVisualization::QAbstract3DGraph::ShadowQualityNone);
m_scatter->setFlags(m_scatter->flags() | Qt::FramelessWindowHint);
_3DWidget = QWidget::createWindowContainer(m_scatter);
m_main_layout->addWidget(_3DWidget);
m_main_layout->setMargin(0);
//X轴的标题
m_scatter->axisX()->setRange(0, MAXSIZE);
m_scatter->axisX()->setTitleVisible(true);
m_scatter->axisX()->setTitle(QStringLiteral("X轴"));
m_scatter->axisX()->setLabelFormat(QStringLiteral("X:%.2f 公里"));//坐标轴保留2位小数
//Z轴的标题
m_scatter->axisZ()->setRange(0, MAXSIZE);
m_scatter->axisZ()->setTitleVisible(true);
m_scatter->axisZ()->setTitle(QStringLiteral("Z轴"));
m_scatter->axisZ()->setLabelFormat(QStringLiteral("Z:%.2f 公里"));
//Y轴(高)的标题
m_scatter->axisY()->setRange(0, MAXSIZE);
m_scatter->axisY()->setTitleVisible(true);
m_scatter->axisY()->setTitle(QStringLiteral("Y轴"));
m_scatter->axisY()->setLabelFormat(QStringLiteral("Y:%.2f 公里"));
//设置网格
m_scatter->axisX()->setSegmentCount((AxisXMaxValue - AxisXMinValue) / 5 + 1);
m_scatter->axisY()->setSegmentCount((AxisYMaxValue - AxisYMinValue) / 15 );
m_scatter->axisZ()->setSegmentCount((AxisZMaxValue - AxisZMinValue) / 5 + 1);
m_scatter->axisX()->setSubSegmentCount(0);
m_scatter->axisY()->setSubSegmentCount(0);
m_scatter->axisZ()->setSubSegmentCount(0);
m_scatter->axisX()->setReversed(true);
m_scatter->scene()->activeLight()->setAutoPosition(false);
m_scatter->scene()->activeCamera()->setCameraPosition(10.0f, 10.0f, 100.0f);
m_scatter->activeTheme()->setType(QtDataVisualization::Q3DTheme::Theme(6));//设置背景为黑色
m_scatter->activeTheme()->setBackgroundEnabled(true);
m_scatter->activeTheme()->setGridEnabled(true);
m_scatter->activeTheme()->setLabelBorderEnabled(true);
m_scatter->activeTheme()->setLabelBackgroundEnabled(true);
QLinearGradient gr;
gr.setColorAt(0.0, QColor("#24205c"));
gr.setColorAt(0.05, QColor("#8cfffb"));
gr.setColorAt(0.08, QColor("#2af84c"));
gr.setColorAt(0.11, QColor("#f8e02a"));
gr.setColorAt(0.15, QColor("#f82ad9"));
gr.setColorAt(0.2, QColor("#c52af8"));
gr.setColorAt(0.25, QColor("#452af8"));
gr.setColorAt(1.0, QColor("#24205c"));
QtDataVisualization::QScatter3DSeries* Group = new QtDataVisualization::QScatter3DSeries();
Group->setColorStyle(QtDataVisualization::Q3DTheme::ColorStyleRangeGradient);
Group->setItemSize(0.02);
Group->setBaseGradient(gr);
Group->setColorStyle(QtDataVisualization::Q3DTheme::ColorStyleRangeGradient);
Group->setMesh((QtDataVisualization::QAbstract3DSeries::Mesh)11);
// 设置系列的颜色渐变
QLinearGradient gradient;
gradient.setColorAt(0.0, QColor(125,200,200));
gradient.setColorAt(0.5, QColor(22,255,255));
gradient.setColorAt(1.0, QColor(255,200,50));
Group->setBaseGradient(gradient);
Group->setMeshSmooth(true);
m_scatter->addSeries(Group);
timerTick = new QTimer(this);
connect(timerTick, &QTimer::timeout,this,&Widget::slot_Update_Line);
timerTick->start(500);
}
Widget::~Widget()
{
delete ui;
}
void Widget::slot_Update_Line()
{
m_scatter->removeSeries(m_Series);
int rand = qrand() % 100 + 50;
//三个序列的颜色
const QColor colors[] = {QColor(255,25,200), QColor(0, 255, 0), QColor(22,255,255), QColor(150, 155, 200), QColor(250, 255, 0)};
//三个序列的名称
const QString names[] = {QStringLiteral("2021年"), QStringLiteral("2022年"), QStringLiteral("2023年")};
m_Series = new QtDataVisualization::QScatter3DSeries();
QtDataVisualization::QScatterDataArray data;
//依次创建三个序列并加入到三维散点图中
for (int i = 0; i < rand; i++)
{
m_Series->setName(names[qrand() % 3]);
m_Series->setBaseColor(colors[qrand() % 5]);
m_Series->setItemSize(0.1);
m_Series->setMesh(QtDataVisualization::QAbstract3DSeries::Mesh::MeshArrow);//设置样式
m_Series->setItemLabelFormat((QStringLiteral("@seriesName (@xLabel, @zLabel) => @yLabel)")));
data << QVector3D((qrand() % 300), (qrand() % 300), qrand() % 300);
m_Series->dataProxy()->addItems(data);
m_scatter->addSeries(m_Series);
}
}