Qt3D カスタムAspectでバックエンド側からフロントエンド側への変更の反映

実現したいこと

Qt3DCore::QAbstractAspectを継承したカスタムAspectを実装しています.バックエンドで行われた変更をフロントエンド側のノードにどのように知らせれば良いでしょうか.

ドキュメントでもあるように,Qt3DCore::QAspectJob::postFrame()がすべてのジョブが完了した後にメインスレッドで呼び出される関数で,ここでフロントエンド側に変更をプッシュすればよいとされています.

QtAPIのバックエンドで行われているようにJobクラスやAspectクラス,BackendNodeクラスに何らかのManagerインスタンスを保持し,各QNodeIdに対応したQNodeのポインタを保持することが考えられます.しかし,バックエンド側が唯一フロント側のQNodeが渡されるのは,変更が生じた際に呼ばれる

c++:

1void QBackendNode::syncFromFrontEnd(const Qt3DCore::QNode* frontEnd, bool first);

だけだと思っています.first == trueのときに,QNodeをmanagerに追加するなどするにしても,const修飾子がついているので変更ができないので困っています.無理やりキャストすることはできますが,他の最適な方法はないでしょうか.

試したこと

QtAPIが提供しているクラスがバックエンドでどのように管理しているかをリポジトリを読んでみました.そこでは上で書いたように

c++

1QNode* QAspectManger::lookupNode(QNodeId id) const2{3 /* ``` 省略 ``` */4 return d->m_scene ? d->m_scene->lookupNode(id) : nullptr;5}6 7QNode* QScene::lookupNode(QNodeId id) const8{9 /* ``` 省略 ``` */10 return d->m_nodeLookupTable.value(id);11}

とManagerクラスを経由してQSceneクラスがフロントエンドのノードのマップを持っていました.しかし,QSceneはプライベートなクラス(APIとして提供されていない)であり,さらにQSceneのマップへノードを追加しているのはQAspectEnginePrivateクラスであり,これもアクセスできません.
QNodeIdからフロントノードの取得する一般的な方法はありますか?または,バックエンドでフロントノードを管理する良い方法はありますか?

補足情報

Qt6.4.2 MSVC2019 64bit

コメントを投稿

0 コメント