本页内容

Q3DSurface Class

Q3DSurface 类提供了用于渲染 3D 曲面图的方法。更多内容...

头文件: #include <Q3DSurface>
CMake: find_package(Qt6 REQUIRED COMPONENTS DataVisualization)
target_link_libraries(mytarget PRIVATE Qt6::DataVisualization)
qmake: QT += datavisualization
自: QtDataVisualization 1.0
继承自: QAbstract3DGraph
状态: 已弃用

该类已弃用。我们强烈建议不要在新代码中使用它。

属性

公共函数

Q3DSurface(const QSurfaceFormat *format = nullptr, QWindow *parent = nullptr)
virtual ~Q3DSurface()
void addAxis(QValue3DAxis *axis)
void addSeries(QSurface3DSeries *series)
QList<QValue3DAxis *> axes() const
QValue3DAxis *axisX() const
QValue3DAxis *axisY() const
QValue3DAxis *axisZ() const
bool flipHorizontalGrid() const
void releaseAxis(QValue3DAxis *axis)
void removeSeries(QSurface3DSeries *series)
QSurface3DSeries *selectedSeries() const
QList<QSurface3DSeries *> seriesList() const
void setAxisX(QValue3DAxis *axis)
void setAxisY(QValue3DAxis *axis)
void setAxisZ(QValue3DAxis *axis)
void setFlipHorizontalGrid(bool flip)

信号

void axisXChanged(QValue3DAxis *axis)
void axisYChanged(QValue3DAxis *axis)
void axisZChanged(QValue3DAxis *axis)
void flipHorizontalGridChanged(bool flip)
void selectedSeriesChanged(QSurface3DSeries *series)

详细说明

该类允许开发人员渲染 3D 曲面图,并通过自由旋转场景来查看这些曲面图。曲面的视觉属性(如绘制模式和着色)可通过 `QSurface3DSeries` 进行控制。

Q3DSurface 支持选择功能:当用户单击鼠标左键(使用默认输入处理程序时)或通过 `QSurface3DSeries` 选中数据点时,该数据点上会显示一个高亮球体。选择指针附带一个标签,默认情况下该标签显示数据点的值及其坐标。

轴上显示的数值范围和标签格式可通过 `QValue3DAxis` 进行控制。

要旋转图表,请按住鼠标右键并移动鼠标。缩放操作通过鼠标滚轮完成。这两项操作均假设正在使用默认输入处理程序。

如果未为 Q3DSurface 显式设置坐标轴,则会创建没有标签的临时默认坐标轴。这些默认坐标轴可通过坐标轴访问器进行修改,但一旦为某个方向显式设置了坐标轴,该方向的默认坐标轴即被销毁。

如何构建一个最简的 Q3DSurface 图形

首先,构建 Q3DSurface。由于本示例中图作为顶级窗口运行,我们需要清除默认已设置的 `Qt::FramelessWindowHint ` 标志:

Q3DSurface surface;
surface.setFlags(surface.flags() ^ Qt::FramelessWindowHint);

现在,Q3DSurface 已准备好接收待渲染的数据。创建数据元素以接收值:

首先将数据输入到行元素中,然后将它们的指针添加到数据元素中:

*dataRow1 << QVector3D(0.0f, 0.1f, 0.5f) << QVector3D(1.0f, 0.5f, 0.5f);
*dataRow2 << QVector3D(0.0f, 1.8f, 1.0f) << QVector3D(1.0f, 1.2f, 1.0f);
*data << dataRow1 << dataRow2;

创建一个新序列并为其设置数据:

QSurface3DSeries *series = new QSurface3DSeries;
series->dataProxy()->resetArray(data);
surface.addSeries(series);

最后,您需要将其设为可见:

surface.show();

创建并显示此图表所需的完整代码如下:

#include <QtDataVisualization>

int main(int argc, char **argv)
{
    qputenv("QSG_RHI_BACKEND", "opengl");
    QGuiApplication app(argc, argv);

    Q3DSurface surface;
    surface.setFlags(surface.flags() ^ Qt::FramelessWindowHint);
    QSurfaceDataArray *data = new QSurfaceDataArray;
    QSurfaceDataRow *dataRow1 = new QSurfaceDataRow;
    QSurfaceDataRow *dataRow2 = new QSurfaceDataRow;

    *dataRow1 << QVector3D(0.0f, 0.1f, 0.5f) << QVector3D(1.0f, 0.5f, 0.5f);
    *dataRow2 << QVector3D(0.0f, 1.8f, 1.0f) << QVector3D(1.0f, 1.2f, 1.0f);
    *data << dataRow1 << dataRow2;

    QSurface3DSeries *series = new QSurface3DSeries;
    series->dataProxy()->resetArray(data);
    surface.addSeries(series);
    surface.show();

    return app.exec();
}

以下是这几行代码生成的效果:

一个简约的3D曲面图,显示了覆盖在网格地面上的绿色折叠山脊表面

该场景支持旋转、缩放,并可选中曲面上的点以查看其位置,但此精简代码示例中未包含其他交互功能。您可通过熟悉提供的示例(如“曲面图”)来深入了解相关内容。

另请参阅 Q3DBars 、Q3DScatter 以及 Qt Data Visualization C++ Classes。

属性文档

axisX : QValue3DAxis*

该属性保存当前的 x 轴。

访问函数:

QValue3DAxis *axisX() const
void setAxisX(QValue3DAxis *axis)

通知信号:

void axisXChanged(QValue3DAxis *axis)

axisY : QValue3DAxis*

此属性用于指定活动 y 轴。

访问函数:

QValue3DAxis *axisY() const
void setAxisY(QValue3DAxis *axis)

通知信号:

void axisYChanged(QValue3DAxis *axis)

axisZ : QValue3DAxis*

该属性保存当前活动的 z 轴。

访问函数:

QValue3DAxis *axisZ() const
void setAxisZ(QValue3DAxis *axis)

通知信号:

void axisZChanged(QValue3DAxis *axis)

[since QtDataVisualization 1.2] flipHorizontalGrid : bool

该属性控制横轴网格是显示在图表上方还是下方。

在某些应用场景中,水平轴网格大多被曲面覆盖,因此将水平轴网格显示在图表上方而非下方会更实用。一个典型的应用场景是使用正交投影并采用自上而下的视点来显示二维频谱图。

如果false ,则横轴网格和标签将绘制在图表的水平背景上。如果true ,则横轴网格和标签将绘制在图表与水平背景相对的一侧。默认值为false 。

该枚举类型在 QtDataVisualization 1.2 中引入。

访问函数:

bool flipHorizontalGrid() const
void setFlipHorizontalGrid(bool flip)

通知器信号:

void flipHorizontalGridChanged(bool flip)

[read-only] selectedSeries : QSurface3DSeries*

该属性存储所选系列或为 null。

如果 selectionMode 设置为SelectionMultiSeries ,则该属性将包含拥有所选点的系列。

访问函数:

QSurface3DSeries *selectedSeries() const

通知器信号:

void selectedSeriesChanged(QSurface3DSeries *series)

成员函数文档

[explicit] Q3DSurface::Q3DSurface(const QSurfaceFormat *format = nullptr, QWindow *parent = nullptr)

构建一个新的3D曲面图,可选地包含parent 窗口和曲面format 。

[virtual noexcept] Q3DSurface::~Q3DSurface()

删除该3D曲面图形。

void Q3DSurface::addAxis(QValue3DAxis *axis)

将axis 添加到图中。通过addAxis添加的坐标轴尚未投入使用,addAxis仅用于将axis 的所有权赋予该图。axis 不能为null,也不能已被添加到其他图中。

另请参阅 releaseAxis()、setAxisX()、setAxisY() 和setAxisZ()。

void Q3DSurface::addSeries(QSurface3DSeries *series)

将series 添加到图表中。一个图表可以包含多个系列,但只有一组坐标轴。如果新添加的系列指定了选定项,该选定项将被高亮显示,且任何现有的选定状态都将被清除。仅有一个新添加的系列可以处于选定状态。

另请参阅 QAbstract3DGraph::hasSeries()。

QList<QValue3DAxis *> Q3DSurface::axes() const

返回所有已添加坐标轴的列表。

另请参阅 addAxis()。

void Q3DSurface::releaseAxis(QValue3DAxis *axis)

如果该axis 已被添加到此图中,则将其所有权交还给调用方。如果被释放的axis 正在被使用,系统将创建一个新的默认轴并将其设为活动状态。

如果默认轴已被释放,随后又被重新添加,其行为将与其他轴无异。

另请参阅 addAxis()、setAxisX()、setAxisY(),以及setAxisZ()。

void Q3DSurface::removeSeries(QSurface3DSeries *series)

从图中移除series 。

另请参阅 QAbstract3DGraph::hasSeries()。

QList<QSurface3DSeries *> Q3DSurface::seriesList() const

返回已添加到该图表的系列列表。

另请参阅 QAbstract3DGraph::hasSeries()。

void Q3DSurface::setAxisX(QValue3DAxis *axis)

将axis 设置为活动x轴。会隐式调用addAxis(),将该轴的所有权转移至此图表。

如果axis 为 null,则会创建一个临时默认坐标轴,该坐标轴无标签且范围会自动调整。

如果显式将另一个坐标轴设置为相同的方位,则该临时坐标轴将被销毁。

注意: 属性axisX 的设置 函数。

另请参阅 axisX()、addAxis() 和releaseAxis()。

void Q3DSurface::setAxisY(QValue3DAxis *axis)

将axis 设置为活动y轴。隐式调用addAxis(),将该轴的所有权转移给此图表。

如果axis 为 null,则会创建一个临时默认坐标轴,该坐标轴无标签且范围会自动调整。

如果显式地将另一个坐标轴设置为相同的取向,则该临时坐标轴将被销毁。

注意: 这是属性axisY 的设置 函数。

另请参阅 axisY()、addAxis() 和releaseAxis()。

void Q3DSurface::setAxisZ(QValue3DAxis *axis)

将axis 设置为活动Z轴。会隐式调用addAxis(),将该轴的所有权转移至此图表。

如果axis 为 null,则会创建一个临时默认坐标轴,该坐标轴无标签且范围会自动调整。

如果显式将另一个坐标轴设置为相同的方向,则该临时坐标轴将被销毁。

注意: 属性axisZ 的设置 函数。

另请参阅 axisZ()、addAxis() 和releaseAxis()。

© 2026 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.