QML动态创建Item实例时无法动态连接destruction信号问题
问题原因
destruction不是QML实例对象自身的原生成员信号,它是Component附加类型提供的附加信号,默认只会在组件声明的上下文里,通过Component.onDestruction的形式暴露信号处理器。
你通过createObject拿到的是组件实例对象本身,这个对象上没有直接挂载destruction属性,所以访问obj.destruction得到的是undefined,调用connect方法自然就会抛出TypeError: Cannot call method 'connect' of undefined的错误。
你在组件内部写Component.onDestruction能正常触发,是因为QML引擎解析组件声明时,会自动把这个处理器绑定到对应附加对象的信号上,和外部从实例对象直接查找信号的访问路径完全不同。
解决方案
选下面任意一种方式实现即可,都能正常拿到动态创建对象的销毁回调:
- 方式一:通过实例的Component附加对象直接连接信号
不需要修改自定义组件的代码,只要调整外部连接信号的写法,访问实例上挂载的Component附加对象,再连接它的destruction信号就行:
这个写法和组件内部写// 替换原来报错的obj.destruction.connect(...)代码 obj.Component.destruction.connect(() => console.log('destruction!'))Component.onDestruction绑定的是同一个信号,对象被主动调用destroy()销毁、或者父对象销毁连带回收子对象时,都会正常触发绑定的回调。 - 方式二:自定义信号透传销毁事件(兼容低版本Qt环境)
如果使用的是Qt5早期版本,对外部访问实例附加对象信号的支持不完善,可以在自定义组件里加一层信号透传:
首先修改MyObj.qml,新增自定义销毁信号:
外部动态创建实例后,直接连接自定义的透传信号即可:Item { id:root signal foo() signal objectDestroyed() property string bar: "bar" Component.onCompleted: root.foo() Component.onDestruction: root.objectDestroyed() }obj.objectDestroyed.connect(() => console.log('destruction!'))
内容的提问来源于stack exchange,提问作者fferri
相关产品推荐
相关产品推荐

