Q3DBarsWidgetItem Class
Q3DBarsWidgetItem 类提供了用于渲染 3D 条形图的方法。更多内容...
| 标题: | #include <Q3DBarsWidgetItem> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS GraphsWidgets) target_link_libraries(mytarget PRIVATE Qt6::GraphsWidgets) |
| qmake: | QT += graphswidgets |
| 继承自: | Q3DGraphsWidgetItem |
- 所有成员列表(包括继承的成员)
- Q3DBarsWidgetItem 属于Qt Graphs 小部件 C++ 类库。
属性
|
|
公共函数
| Q3DBarsWidgetItem(QObject *parent = nullptr) | |
| virtual | ~Q3DBarsWidgetItem() override |
| void | addAxis(QAbstract3DAxis *axis) |
| void | addSeries(QBar3DSeries *series) |
| QList<QAbstract3DAxis *> | axes() const |
| QSizeF | barSeriesMargin() const |
| QSizeF | barSpacing() const |
| float | barThickness() const |
| QCategory3DAxis * | columnAxis() const |
| float | floorLevel() const |
| void | insertSeries(int index, QBar3DSeries *series) |
| bool | isBarSpacingRelative() const |
| bool | isMultiSeriesUniform() const |
| QBar3DSeries * | primarySeries() const |
| void | releaseAxis(QAbstract3DAxis *axis) |
| void | removeSeries(QBar3DSeries *series) |
(since 6.10) void | renderSliceToImage(int requestedIndex, QtGraphs3D::SliceCaptureType sliceType) |
| QCategory3DAxis * | rowAxis() const |
| QBar3DSeries * | selectedSeries() const |
| QList<QBar3DSeries *> | seriesList() const |
| QValue3DAxis * | valueAxis() const |
公共槽位
| void | setBarSeriesMargin(QSizeF margin) |
| void | setBarSpacing(QSizeF spacing) |
| void | setBarSpacingRelative(bool relative) |
| void | setBarThickness(float thicknessRatio) |
| void | setColumnAxis(QCategory3DAxis *axis) |
| void | setFloorLevel(float level) |
| void | setMultiSeriesUniform(bool uniform) |
| void | setPrimarySeries(QBar3DSeries *series) |
| void | setRowAxis(QCategory3DAxis *axis) |
| void | setValueAxis(QValue3DAxis *axis) |
信号
| void | barSeriesMarginChanged(QSizeF margin) |
| void | barSpacingChanged(QSizeF spacing) |
| void | barSpacingRelativeChanged(bool relative) |
| void | barThicknessChanged(float thicknessRatio) |
| void | columnAxisChanged(QCategory3DAxis *axis) |
| void | floorLevelChanged(float level) |
| void | multiSeriesUniformChanged(bool uniform) |
| void | primarySeriesChanged(QBar3DSeries *series) |
| void | rowAxisChanged(QCategory3DAxis *axis) |
| void | selectedSeriesChanged(QBar3DSeries *series) |
(since 6.10) void | sliceImageChanged(const QImage &image) |
| void | valueAxisChanged(QValue3DAxis *axis) |
详细说明
该类允许开发者渲染 3D 柱状图,并通过自由旋转场景来查看它们。旋转操作通过按住鼠标右键并移动鼠标来实现,而缩放则通过鼠标滚轮完成。如果启用了该功能,则使用鼠标左键进行选择。 点击鼠标滚轮可将场景重置为默认摄像机视图。在触控设备上,通过轻点并拖动实现旋转,轻点并长按实现选择,双指捏合实现缩放。
如果未为 Q3DBarsWidgetItem 显式设置坐标轴,则会创建没有标签的临时默认坐标轴。这些默认坐标轴可通过坐标轴访问器进行修改,但一旦为某个方向显式设置了坐标轴,该方向的默认坐标轴即被销毁。
Q3DBarsWidgetItem 支持同时显示多个系列。各系列的行数和列数不必相同。行和列标签将取自第一个添加的系列,除非为行轴和列轴显式定义了标签。
Q3DBarsWidgetItem 支持透明度功能。此功能允许您调整条形图的透明度,使其呈现部分透明、完全透明或不透明的效果。
如何构建一个最简的 Q3DBarsWidgetItem 图表
首先,创建一个 Q3DBarsWidgetItem 实例:
QQuickWidget quickWidget;
Q3DBarsWidgetItem bars;
bars.setWidget(&quickWidget);
bars.widget()->setMinimumSize(QSize(256, 256));创建 Q3DBarsWidgetItem 实例后,您可以通过修改行轴和列轴的范围来设置数据窗口。此操作并非强制要求,因为数据窗口默认会显示系列中的所有数据。如果数据量较大,通常建议仅显示其中的一部分。 例如,我们将数据窗口设置为显示前五行和前五列:
bars.rowAxis()->setRange(0, 4);
bars.columnAxis()->setRange(0, 4);现在,Q3DBarsWidgetItem 已准备好接收待渲染的数据。创建一个包含一行 5 个值的系列:
QBar3DSeries series;
QBarDataRow data;
data << QBarDataItem(1.0f) << QBarDataItem(3.0f) << QBarDataItem(7.5f) << QBarDataItem(5.0f)
<< QBarDataItem(2.2f);
series.dataProxy()->addRow(data);
bars.addSeries(&series);注意:我们虽然 将数据窗口设置为 5×5,但仅添加了一行数据。这没有问题;其余行将保持空白。
最后,您需要将其设为可见:
bars.widget()->show();创建并显示此图表所需的完整代码如下:
#include <QtGraphs>
#include <QtGraphsWidgets/q3dbarswidgetitem.h>
#include <QtWidgets/qapplication.h>
int main(int argc, char **argv)
{
QApplication app(argc, argv);
QQuickWidget quickWidget;
Q3DBarsWidgetItem bars;
bars.setWidget(&quickWidget);
bars.widget()->setMinimumSize(QSize(256, 256));
bars.rowAxis()->setRange(0, 4);
bars.columnAxis()->setRange(0, 4);
QBar3DSeries series;
QBarDataRow data;
data << QBarDataItem(1.0f) << QBarDataItem(3.0f) << QBarDataItem(7.5f) << QBarDataItem(5.0f)
<< QBarDataItem(2.2f);
series.dataProxy()->addRow(data);
bars.addSeries(&series);
bars.widget()->show();
return app.exec();
}而这几行代码生成的效果如下:

该场景支持旋转、缩放,并可选中柱状图条查看其数值,但此简易代码示例中未包含其他交互功能。您可通过熟悉提供的示例(如“简单柱状图”)来进一步学习。
另请参阅 Q3DScatterWidgetItem 、Q3DSurfaceWidgetItem 以及Qt Graphs 中的 3D C++ 类。
属性文档
barSeriesMargin : QSizeF
X 和 Z 维度中各系列列之间的间距。合理的取值范围为 [0,1)。
默认预设值为(0.0, 0.0) 。此属性可实现将不同系列的柱形并排显示,同时在各列之间保留间距。
访问函数:
| QSizeF | barSeriesMargin() const |
| void | setBarSeriesMargin(QSizeF margin) |
通知信号:
| void | barSeriesMarginChanged(QSizeF margin) |
另请参阅 barSpacing 。
barSpacing : QSizeF
X 和 Z 方向上的条形间距。
默认预设值为(1.0, 1.0) 。间距受barSpacingRelative 属性的影响。
访问函数:
| QSizeF | barSpacing() const |
| void | setBarSpacing(QSizeF spacing) |
通知信号:
| void | barSpacingChanged(QSizeF spacing) |
另请参阅 barSpacingRelative 、multiSeriesUniform 和barSeriesMargin 。
barSpacingRelative : bool
无论间距是绝对的还是相对于条形厚度而言的,此属性均有效。
如果该属性为true ,则0.0 的值表示条形图并排排列,1.0 表示条形图之间留有与单个条形图厚度等宽的间距,以此类推。默认值为true 。
访问函数:
| bool | isBarSpacingRelative() const |
| void | setBarSpacingRelative(bool relative) |
通知信号:
| void | barSpacingRelativeChanged(bool relative) |
barThickness : float
此属性控制X轴与Z轴方向上型材的厚度比例。
值1.0 表示条块的宽度与深度相等,而0.5 则表示条块的深度是宽度的两倍。默认预设值为1.0 。
访问函数:
| float | barThickness() const |
| void | setBarThickness(float thicknessRatio) |
通知信号:
| void | barThicknessChanged(float thicknessRatio) |
columnAxis : QCategory3DAxis*
该属性存储与活动列关联的坐标轴。
将活动列的坐标轴设置为axis 。会隐式调用addAxis(),将该坐标轴的所有权转移至此图表。
如果axis 为null,则会创建一个没有标签的临时默认坐标轴。如果显式地将另一个坐标轴设置为相同的方位,则该临时坐标轴将被销毁。
访问函数:
| QCategory3DAxis * | columnAxis() const |
| void | setColumnAxis(QCategory3DAxis *axis) |
通知器信号:
| void | columnAxisChanged(QCategory3DAxis *axis) |
另请参阅 addAxis() 和releaseAxis()。
floorLevel : float
该属性用于指定条形图在Y轴数据坐标系中的下限。
实际底线高度将受Y轴最小值和最大值的限制。默认值为零。
访问函数:
| float | floorLevel() const |
| void | setFloorLevel(float level) |
通知信号:
| void | floorLevelChanged(float level) |
multiSeriesUniform : bool
无论显示的是多个系列,该属性都会决定条形是否根据单个系列的条形比例进行缩放。
如果设置为true ,则bar spacing 仅会正确应用于X轴。默认预设为false 。
访问函数:
| bool | isMultiSeriesUniform() const |
| void | setMultiSeriesUniform(bool uniform) |
通知信号:
| void | multiSeriesUniformChanged(bool uniform) |
primarySeries : QBar3DSeries*
该属性存储图表的主序列。
将series 设置为图表的主系列。当未在坐标轴上显式设置标签时,主系列将决定行轴和列轴的标签。
如果指定的系列尚未添加到图表中,将其设置为主系列也会将其隐式地添加到图表中。
如果主系列本身从图表中被删除,则此属性将重置为默认值。
如果 `series ` 为空,则该属性将重置为默认值。默认值为第一个添加的系列;如果图表中未添加任何系列,则默认值为零。
访问函数:
| QBar3DSeries * | primarySeries() const |
| void | setPrimarySeries(QBar3DSeries *series) |
通知信号:
| void | primarySeriesChanged(QBar3DSeries *series) |
rowAxis : QCategory3DAxis*
该属性存储与活动行关联的坐标轴。
将活动行的坐标轴设置为axis 。会隐式调用addAxis(),将该坐标轴的所有权转移至此图表。
如果axis 为null,则会创建一个没有标签的临时默认坐标轴。如果显式将另一个坐标轴设置为相同的方位,则该临时坐标轴将被销毁。
访问函数:
| QCategory3DAxis * | rowAxis() const |
| void | setRowAxis(QCategory3DAxis *axis) |
通知器信号:
| void | rowAxisChanged(QCategory3DAxis *axis) |
另请参阅 addAxis() 和releaseAxis()。
[read-only] selectedSeries : QBar3DSeries*
该属性保存所选系列或一个空值。
如果 selectionMode 设置了SelectionMultiSeries 标志,则该属性将存储包含所选柱状图的系列。
访问函数:
| QBar3DSeries * | selectedSeries() const |
通知器信号:
| void | selectedSeriesChanged(QBar3DSeries *series) |
valueAxis : QValue3DAxis*
将活动值轴(Y 轴)设置为 `axis`。隐式调用 `addAxis()` 方法,将 `axis ` 的所有权转移至该图表。
如果 `axis ` 为 `null`,则会创建一个临时默认坐标轴,该坐标轴无标签且范围会自动调整。如果显式将另一个坐标轴设置为相同的朝向,则该临时坐标轴将被销毁。
访问函数:
| QValue3DAxis * | valueAxis() const |
| void | setValueAxis(QValue3DAxis *axis) |
通知器信号:
| void | valueAxisChanged(QValue3DAxis *axis) |
另请参阅 addAxis() 和releaseAxis()。
成员函数文档
[explicit] Q3DBarsWidgetItem::Q3DBarsWidgetItem(QObject *parent = nullptr)
使用可选参数parent 构建一个新的3D条形图。
[override virtual noexcept] Q3DBarsWidgetItem::~Q3DBarsWidgetItem()
删除该3D柱状图。
void Q3DBarsWidgetItem::addAxis(QAbstract3DAxis *axis)
将axis 添加到图中。通过 addAxis 添加的坐标轴尚未被实际使用,addAxis 仅用于将axis 的所有权赋予该图。该axis 不能为 null,也不能已添加到其他图中。
另请参阅 releaseAxis()、setValueAxis()、setRowAxis() 以及setColumnAxis()。
void Q3DBarsWidgetItem::addSeries(QBar3DSeries *series)
将series 添加到图表中。一个图表可以包含多个数据系列,但只能有一组坐标轴,因此所有数据系列的行和列必须匹配,可视化数据才有意义。 如果图表中有多个可见系列,且未为坐标轴显式设置标签,则只有主系列会在坐标轴上生成行或列标签。如果新添加的系列指定了选定条形,该条形将被高亮显示,且任何现有选中状态将被清除。仅有一个已添加的系列可以处于选中状态。
另请参阅 seriesList()、primarySeries 以及Q3DGraphsWidgetItem::hasSeries()。
QList<QAbstract3DAxis *> Q3DBarsWidgetItem::axes() const
返回所有已添加坐标轴的列表。
另请参阅 addAxis()。
void Q3DBarsWidgetItem::insertSeries(int index, QBar3DSeries *series)
将series 插入到序列列表中的index 位置。如果series 已添加到列表中,则将其移动到新的index 。
注意:当 将一个系列移动到位于其旧索引之后的新index 时 ,列表中的新位置是按照该系列仍位于旧索引的位置来计算的,因此最终索引实际上是index 减去1。
另请参阅 addSeries()、seriesList() 和Q3DGraphsWidgetItem::hasSeries()。
void Q3DBarsWidgetItem::releaseAxis(QAbstract3DAxis *axis)
如果该axis 已添加到此图中,则将其所有权释放回调用方。如果被释放的axis 正在被使用,则会创建一个新的默认轴并将其设为活动状态。
如果默认轴已被释放,随后又被重新添加,其行为将与任何其他轴相同。
另请参阅 addAxis()、setValueAxis()、setRowAxis() 以及setColumnAxis()。
void Q3DBarsWidgetItem::removeSeries(QBar3DSeries *series)
从图中移除series 。
另请参阅 Q3DGraphsWidgetItem::hasSeries()。
[since 6.10] void Q3DBarsWidgetItem::renderSliceToImage(int requestedIndex, QtGraphs3D::SliceCaptureType sliceType)
将请求的切片视图导出为图像。导出的切片由行或列的条带组成,这些条带由sliceType 定义,并位于给定的requestedIndex 处。
当图像准备就绪时,会发出sliceImageChanged 信号,可按以下方式捕获:
connect(item, &Q3DBarsWidgetItem::sliceImageChanged, this, [](const QImage &image) {
// ~~~
});
item->renderSliceToImage(sliceType, index);图像将根据当前的抗锯齿设置进行渲染。
该函数首次引入于 Qt 6.10。
另请参阅 QQuickItem::grabToImage() 和sliceImageChanged()。
QList<QBar3DSeries *> Q3DBarsWidgetItem::seriesList() const
返回已添加到该图表的系列列表。
另请参阅 Q3DGraphsWidgetItem::hasSeries()。
[signal, since 6.10] void Q3DBarsWidgetItem::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.