本页内容

Q3DSurfaceWidgetItem Class

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

头文件: #include <Q3DSurfaceWidgetItem>
CMake: find_package(Qt6 REQUIRED COMPONENTS GraphsWidgets)
target_link_libraries(mytarget PRIVATE Qt6::GraphsWidgets)
qmake: QT += graphswidgets
继承自: Q3DGraphsWidgetItem

属性

公共函数

Q3DSurfaceWidgetItem(QObject *parent = nullptr)
virtual ~Q3DSurfaceWidgetItem() override
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)
(since 6.10) void renderSliceToImage(int index, int requestedIndex, QtGraphs3D::SliceCaptureType sliceType)
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)
(since 6.10) void sliceImageChanged(const QImage &image)

详细说明

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

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

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

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

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

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

首先,构建 Q3DSurfaceWidgetItem。由于本示例中该图作为顶级窗口运行,因此需要清除默认设置的Qt::FramelessWindowHint 标志:

QQuickWidget quickWidget;
Q3DSurfaceWidgetItem surface;
surface.setWidget(&quickWidget);
surface.widget()->setMinimumSize(QSize(256, 256));

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

注意:在 新的代理-系列关系中 ,数据存储在系列中。因此,为了使代理能够添加、删除或编辑数据,必须先创建一个系列。

首先将数据填入行元素,然后将这些行元素的指针添加到数据元素中:

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

创建一个新系列并向其中设置数据:

QSurface3DSeries series;
series.dataProxy()->resetArray(data);
surface.addSeries(&series);

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

surface.widget()->show();

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

#include <QtGraphs>
#include <QtGraphsWidgets/q3dsurfacewidgetitem.h>
#include <QtWidgets/qapplication.h>

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

    QQuickWidget quickWidget;
    Q3DSurfaceWidgetItem surface;
    surface.setWidget(&quickWidget);
    surface.widget()->setMinimumSize(QSize(256, 256));
    QSurfaceDataArray data;
    QSurfaceDataRow dataRow1;
    QSurfaceDataRow dataRow2;

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

    QSurface3DSeries series;
    series.dataProxy()->resetArray(data);
    surface.addSeries(&series);
    surface.widget()->show();

    return app.exec();
}

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

带有倾斜绿色平面的3D曲面图

该场景可以旋转、放大,并可选中曲面上的点来查看其位置,但这个简化的代码示例中未包含其他交互功能。您可以通过熟悉提供的示例(如“曲面图库”)来了解更多信息。

另请参阅 Q3DBarsWidgetItem 、Q3DScatterWidgetItem 以及Qt Graphs 中的 3D C++ 类。

属性文档

axisX : QValue3DAxis*

该属性用于指定当前活动的 x 轴。

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

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

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

访问函数:

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

通知器信号:

void axisXChanged(QValue3DAxis *axis)

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

axisY : QValue3DAxis*

该属性用于指定当前活动的 y 轴。

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

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

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

访问函数:

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

通知信号:

void axisYChanged(QValue3DAxis *axis)

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

axisZ : QValue3DAxis*

该属性用于指定当前活动的 z 轴。

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

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

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

访问函数:

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

通知信号:

void axisZChanged(QValue3DAxis *axis)

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

flipHorizontalGrid : bool

该属性控制横轴网格是显示在图表顶部还是底部。

在某些使用场景中,横轴网格大部分会被图形覆盖,因此将横轴网格显示在图形上方而非下方会更实用。一个典型的应用场景是使用正交投影并采用俯视视角来显示二维频谱图。

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

访问函数:

bool flipHorizontalGrid() const
void setFlipHorizontalGrid(bool flip)

通知信号:

void flipHorizontalGridChanged(bool flip)

[read-only] selectedSeries : QSurface3DSeries*

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

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

访问函数:

QSurface3DSeries *selectedSeries() const

通知器信号:

void selectedSeriesChanged(QSurface3DSeries *series)

成员函数文档

[explicit] Q3DSurfaceWidgetItem::Q3DSurfaceWidgetItem(QObject *parent = nullptr)

使用可选参数parent 构建一个新的3D曲面图。

[override virtual noexcept] Q3DSurfaceWidgetItem::~Q3DSurfaceWidgetItem()

删除该3D曲面图。

void Q3DSurfaceWidgetItem::addAxis(QValue3DAxis *axis)

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

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

void Q3DSurfaceWidgetItem::addSeries(QSurface3DSeries *series)

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

另请参阅 Q3DGraphsWidgetItem::hasSeries()。

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

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

另请参阅 addAxis()。

void Q3DSurfaceWidgetItem::releaseAxis(QValue3DAxis *axis)

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

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

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

void Q3DSurfaceWidgetItem::removeSeries(QSurface3DSeries *series)

从图中移除series 。

另请参阅 Q3DGraphsWidgetItem::hasSeries()。

[since 6.10] void Q3DSurfaceWidgetItem::renderSliceToImage(int index, int requestedIndex, QtGraphs3D::SliceCaptureType sliceType)

将请求的切片视图导出为图像。切片结果是一系列index 。要导出所有系列,请将index 设置为-1。导出的切片是一行或一列,由sliceType 定义,位于给定的requestedIndex 处。

当图像准备就绪时,会发出sliceImageChanged 信号,可按以下方式捕获:

connect(item, &Q3DSurfaceWidgetItem::sliceImageChanged, this, [](const QImage &image) {
    // ~~~
});

item->renderSliceToImage(sliceType, index);

图像将根据当前的抗锯齿设置进行渲染。

该函数在 Qt 6.10 中引入。

另请参阅 QQuickItem::grabToImage() 和sliceImageChanged()。

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

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

另请参阅 Q3DGraphsWidgetItem::hasSeries()。

[signal, since 6.10] void Q3DSurfaceWidgetItem::sliceImageChanged(const QImage &image)

当renderSliceToImage 准备好image 时触发此信号。

该函数在 Qt 6.10 中引入。

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