PySide6 QML中Label的Component.onCompleted为何被调用两次?
PySide6中pyside6-qml预览Label时Component.onCompleted被调用两次的原因
问题场景
在PySide6虚拟环境中使用pyside6-qml工具预览QML代码时出现异常:
- 运行Test1.qml时,
Component.onCompleted被调用两次,控制台输出两条qml: Label日志:
// Test1.qml import QtQuick import QtQuick.Controls Label { text: "Hello" Component.onCompleted: console.log("Label") }
- 将根元素替换为Window,运行Test2.qml时,仅输出一条
qml: Window日志,Component.onCompleted仅被调用一次:
// Test2.qml import QtQuick import QtQuick.Window Window { visible: true Component.onCompleted: console.log("Window") }
原因解释
这是因为pyside6-qml工具在预览非Window类型的根元素时,会自动创建一个Window容器来包裹你的根组件,进而导致两次Component.onCompleted触发:
- 你的Label组件自身完成初始化,触发第一次回调;
- 工具自动创建的Window容器完成初始化的过程中,会导致Label组件被再次实例化或触发完成事件,最终出现两次日志输出。
当根元素是Window时,pyside6-qml直接将其作为顶层容器,不会额外创建包裹的Window,因此只会触发一次Component.onCompleted。
内容的提问来源于stack exchange,提问作者Isaac
相关产品推荐
相关产品推荐

