You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 05:31:36