处理来自 Component.onCompleted 的信号

Sko*_*gen 2 qt signals qml

我在同一目录中有两个 qml 文件,main.qml 和 MyItem.qml。当鼠标区域被单击时,消息“clicked!” 由 onMessage main.qml 成功处理。然而,main.qml 永远不会检索/处理消息“信号已发送”。为什么?

主要.qml:

import QtQuick 2.0

Item {
 width: 100; height: 100

 Loader {
    id: myLoader
    source: "MyItem.qml"

    Connections {
        target: myLoader.item
        onMessage: console.log(msg)
    }
 }
}
Run Code Online (Sandbox Code Playgroud)

我的项目.qml:

import QtQuick 2.0

Rectangle {
 id: myItem
 signal message(string msg)

 width: 100; height: 100

 Component.onCompleted: {
   myItem.message("signal sent");
 }

 MouseArea {  
   anchors.fill: parent
   onClicked: myItem.message("clicked!")
 }
}
Run Code Online (Sandbox Code Playgroud)

Mit*_*tch 5

因为MyItem是之前构造的myLoader,所以Connections对象还没有连接。您可以通过向Component.onCompleted每个对象的处理程序添加一些打印语句来看到这一点:

主.qml

import QtQuick 2.0

Item {
    width: 100; height: 100

    Loader {
        id: myLoader
        source: "MyItem.qml"

        Connections {
            target: myLoader.item
            onMessage: console.log(msg)

            Component.onCompleted: print("Connections Component.onCompleted")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的项目.qml

import QtQuick 2.0

Rectangle {
    id: myItem
    signal message(string msg)

    width: 100; height: 100

    Component.onCompleted: {
        print("MyItem Component.onCompleted")
        myItem.message("signal sent");
    }

    MouseArea {
        anchors.fill: parent
        onClicked: myItem.message("clicked!")
    }
}
Run Code Online (Sandbox Code Playgroud)

输出

qml: MyItem Component.onCompleted
qml: Connections Component.onCompleted
Run Code Online (Sandbox Code Playgroud)