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

Qt 5.15.2使用QtQuick Dialogs 1创建多窗口时出现TypeError报错

问题根因

该报错是Qt 5.15版本中QtQuick.Dialogs 1.2模块的固有生命周期缺陷导致,触发逻辑如下:

  • 你动态创建新窗口时,调用component.createObject()未指定父对象,新建的顶层窗口会被注册到QML引擎的全局顶层对象列表
  • 1.2版本的FileDialog属于非原生实现的旧组件,内部会监听引擎全局的窗口新增事件,遍历所有顶层窗口绑定样式、焦点关联的内部逻辑
  • 首个新窗口创建时,全局仅存在初始主窗口,绑定校验逻辑可正常执行;从第二个新窗口开始,FileDialog内部的对象回收逻辑存在缺陷,会错误访问已被垃圾回收的临时对象、未完成初始化的SplitView关联项,最终抛出空值转换失败、属性/方法不存在的报错
  • 由于你未主动调用openDialog.open(),FileDialog的延迟初始化逻辑仅在全局窗口新增时触发遍历校验,因此移除未使用的FileDialog定义后,报错会完全消失。
解决建议

按优先级从高到低可选择以下方案:

  • 替换存在缺陷的组件版本:将import QtQuick.Dialogs 1.2替换为import QtQuick.Dialogs 1.3,或使用Qt 5.15配套的原生文件对话框组件,旧版1.2版本的FileDialog早已停止维护,除该问题外还存在多窗口焦点异常、样式错乱等已知问题。
  • 若必须保留现有FileDialog实现,动态创建窗口时显式指定父对象,避免新窗口被注册到全局顶层列表触发FileDialog的错误遍历,修改newWindow函数代码如下:
function newWindow() {
    console.log("new window")
    var component = Qt.createComponent("reproducer.qml")
    // 显式指定父对象为当前主窗口
    var window = component.createObject(root)
    return window
}
  • 临时规避方案:将FileDialog实例提升为应用全局单例,不要在可重复实例化的窗口组件内定义FileDialog,所有窗口的文件选择逻辑统一调用全局单例实例,避免多实例重复注册全局监听。

内容的提问来源于stack exchange,提问作者Viktor Khristenko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 21:21:36