Qt3D变化通知系统QSceneChange使用示例
Qt3D change notification system usage example of QSceneChange
我需要监听 Qt3D 场景树中的变化(节点添加、删除、属性 更改等...)。
我找到了 class QSceneChange
但是文档丢失了,我找不到使用示例。
如何使用此 class 来监视节点 create/destroy 事件?
我知道这个问题有点老了(也许你已经找到了答案)但我会尝试阐明这个问题:
您可以侦听您创建的节点上的更改。 IE。当您添加 QNode
时,您可以将其信号连接到您实施的插槽。以下信号可用:
- 节点已删除:
nodeDestroyed()
- 父节点已更改(即节点设置为不同的父节点):
parentChanged()
这两个信号由 QNode
发出,因此,所有继承 classes。没有 Node added 信号,因为您知道何时创建节点并将它们添加到框架图中。所有框架图 classes 都继承自 QNode
,因此它们会发出这些信号(QEntity
、QAttribute
、...)。
所有其他信号取决于各自的继承 class,因此由它们发出。
例如,如果您想监听 QAttribute
的属性变化,您必须将插槽连接到 class 的信号。可以看到这样一个列表here.
更多解释:
QSceneChange
不是为你准备的,而是为后端准备的。 Qt3D 使用前端 - 后端方案,您可以在其中使用 QEntity
或 QAttribute
或其他任何前端节点 - 即 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
的新实现或类似的东西)但它们不适合你。
我需要监听 Qt3D 场景树中的变化(节点添加、删除、属性 更改等...)。
我找到了 class QSceneChange
但是文档丢失了,我找不到使用示例。
如何使用此 class 来监视节点 create/destroy 事件?
我知道这个问题有点老了(也许你已经找到了答案)但我会尝试阐明这个问题:
您可以侦听您创建的节点上的更改。 IE。当您添加 QNode
时,您可以将其信号连接到您实施的插槽。以下信号可用:
- 节点已删除:
nodeDestroyed()
- 父节点已更改(即节点设置为不同的父节点):
parentChanged()
这两个信号由 QNode
发出,因此,所有继承 classes。没有 Node added 信号,因为您知道何时创建节点并将它们添加到框架图中。所有框架图 classes 都继承自 QNode
,因此它们会发出这些信号(QEntity
、QAttribute
、...)。
所有其他信号取决于各自的继承 class,因此由它们发出。
例如,如果您想监听 QAttribute
的属性变化,您必须将插槽连接到 class 的信号。可以看到这样一个列表here.
更多解释:
QSceneChange
不是为你准备的,而是为后端准备的。 Qt3D 使用前端 - 后端方案,您可以在其中使用 QEntity
或 QAttribute
或其他任何前端节点 - 即 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
的新实现或类似的东西)但它们不适合你。