Qt3D变化通知系统QSceneChange使用示例

Qt3D change notification system usage example of QSceneChange

我需要监听 Qt3D 场景树中的变化(节点添加、删除、属性 更改等...)。

我找到了 class QSceneChange 但是文档丢失了,我找不到使用示例。

如何使用此 class 来监视节点 create/destroy 事件?

我知道这个问题有点老了(也许你已经找到了答案)但我会尝试阐明这个问题:

您可以侦听您创建的节点上的更改。 IE。当您添加 QNode 时,您可以将其信号连接到您实施的插槽。以下信号可用:

这两个信号由 QNode 发出,因此,所有继承 classes。没有 Node added 信号,因为您知道何时创建节点并将它们添加到框架图中。所有框架图 classes 都继承自 QNode,因此它们会发出这些信号(QEntityQAttribute、...)。


所有其他信号取决于各自的继承 class,因此由它们发出。

例如,如果您想监听 QAttribute 的属性变化,您必须将插槽连接到 class 的信号。可以看到这样一个列表here.


更多解释:

QSceneChange 不是为你准备的,而是为后端准备的。 Qt3D 使用前端 - 后端方案,您可以在其中使用 QEntityQAttribute 或其他任何前端节点 - 即 all classes inheriting QNode 是前端节点(请参阅 link 中的 "Inherited By:" 部分。

当您访问他们的 GitHub 存储库并查看 render folder 示例时,您会看到有一个 backend 和一个 frontend 文件夹。

frontend 文件夹包含所有 Q-class,例如 QEntity 等等。 backend 文件夹包含相应的后端节点,在本例中为 Entity。我不确定为什么他们没有正确地分开所有东西,但是如果你查看 framegraph folder 你会再次看到相同的模式 - 一些 classes 以 Q 和相应的 classes 没有 Q.

现在,前端使用 QSceneChange 将其节点的变化通知后端,以便后端可以相应地采取行动。 Qt3D 的创建者可能认为没有必要有一个信号来通知您所有的变化。大多数时候你会想要订阅一个特定的 属性 改变的事件,比如 QAttribute 中的 byteStrideChanged() (你为什么要对每一个改变做出反应?)。

我假设你可以以某种方式拦截那些 QSceneChange 事件(QNode 的新实现或类似的东西)但它们不适合你。