QT QML 从另一个 QML 对象访问附加 属性

QT QML Accessing Attached Property From Another QML Object

main.qml:

import QtQuick 2.11
import QtQuick.Controls 2.2
import QtQuick.Layouts 1.3

ApplicationWindow {
    id: window
    x: 200
    y: 200
    visible: true

    Component {
        id: firstViewComponent
        FirstView {
            id: firstView
        }
    }

    StackView {
        id: stackView
        anchors.fill: parent
        Component.onCompleted: push(firstViewComponent)
    }

    Timer {
          interval: 1000
          running: true
          onTriggered: stackView.pop()
    }
}

FirstView.qml:

Rectangle {
    id: view
    StackView.onDeactivating: console.log('view: view is deactivating')

    ListModel {
        id: aModel
        ListElement {
            name: 'Element 0'
        }
        ListElement {
            name: 'Element 1'
        }
    }

    ListView {
        id: listView
        model: aModel

        delegate: Rectangle {
            id: listViewDelegate
            Connections {
                target: view.StackView  // <---- DOESN'T WORK
                onDeactivating: console.log('delegate ' + index + ': needs to do some housekeeping now')
            }
        }    
    }
}

我有一个由 main.qml 中的 StackView 实例化的视图。 StackView 将信号 StackView.onDeactivating 附加到视图。除了信号所连接的对象之外,是否有任何方法可以连接到来自其他对象的信号?弹出视图时,我需要在 listViewDelegate 中进行一些清理。

我可以让视图发出自己的信号,并让委托响应该信号。但我想知道是否有一种方法可以连接到附加信号:StackView.onDeactivating 来自不同的对象 (listViewDelegate)。

是也不是。 Qt 文档部分解决了这个问题:A Note About Accessing Attached Properties and Signal Handlers

不可能直接从child访问属性。附加属性需要由提供它们的 class 显式读取。对于您的示例,parent class (StackView) 只需搜索它在 child 项 (FirstView) 中提供的所有附加属性被添加,并通过在内部将它们连接到提供它们的任何逻辑来处理所有找到的 properties/signals 等。

但是,只要您通过 id:

引用它,没有什么能阻止您从 parent 项目中获取附加的 属性
sampleProp: view.StackView.someProperty

问题是:这种间接访问仅适用于属性而不适用于信号,因为您不能简单地通过 view.StackView 引用附加的 object - 很遗憾,您是通过在根项中创建第二个信号并在附加信号被发射时发射它,坚持将信号间接转发到 child 元素。