Qt3D пример использования системы уведомлений об изменениях QSceneChange - PullRequest
0 голосов
/ 25 февраля 2020

Мне нужно прослушать изменения в дереве сцены Qt3D (узел добавлен, удален, свойство изменено и т. Д. c ...).

Я нашел класс QSceneChange но документация отсутствует, и я не могу найти пример использования.

Как использовать этот класс для наблюдения за событиями создания / уничтожения узла?

1 Ответ

1 голос
/ 20 марта 2020

Я знаю, что этот вопрос немного устарел (и, возможно, вы уже нашли ответ), но я постараюсь пролить свет на эту проблему:

Вы можете прослушать изменения на созданных вами узлах , Т.е. когда вы добавляете QNode, вы можете подключить его сигналы к вашим реализованным слотам. Доступны следующие сигналы:

  • Узел удален : nodeDestroyed()
  • Родитель изменен (т.е. для узла был установлен другой родительский элемент): parentChanged()

Эти два сигнала испускаются QNode и, следовательно, всеми наследующими классами. Нет Node добавленного сигнала , потому что вы знаете, когда создавали узлы и добавляли их в фрейм-граф. Все классы framegraph наследуются от QNode, поэтому они излучают эти сигналы (QEntity, QAttribute, ...).


Все остальные сигналы зависят от соответствующего класса наследования и являются таким образом, испускаемые ими.

Например, если вы хотите прослушать изменения в свойствах QAttribute, вы должны подключить слоты к сигналам этого класса. Вы можете увидеть такой список здесь .


Еще несколько объяснений:

QSceneChange предназначен не для вас, а для серверной части. Qt3D использует схему front-end - back-end, где вы используете интерфейсные узлы, такие как QEntity или QAttribute или что угодно - т.е. все классы, наследующие QNode, являются интерфейсными узлами (смотрите Раздел «Наследуется:» в ссылке).

Когда вы посещаете их репозиторий GitHub и, например, смотрите на render folder, вы видите, что есть backend и * Папка 1055 *.

Папка frontend содержит все классы Q, например QEntity и т. Д. Папка backend содержит соответствующие внутренние узлы, в данном случае Entity. Я не уверен, почему они не все отделили должным образом, но если вы посмотрите framegraph folder, вы снова увидите тот же шаблон - некоторые классы, начинающиеся с Q, и соответствующие классы без Q.

enter image description here

Теперь интерфейс уведомляет серверную часть об изменениях в его узлах, используя QSceneChange, так что задняя часть -конец может действовать соответственно. Создатели Qt3D, вероятно, решили, что нет необходимости иметь сигнал, который уведомляет вас обо всех изменениях. Большую часть времени вы хотели бы подписаться на одно конкретное c событие изменения свойства, например byteStrideChanged() в QAttribute (Почему вы хотите реагировать на каждое изменение?).

Я полагаю Вы могли бы как-то перехватить эти QSceneChange события (новая реализация QNode или что-то в этом роде), но они не предназначены для вас.

...