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

Col*_*lin 3 qt attached-properties qml

主要.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()
    }
}
Run Code Online (Sandbox Code Playgroud)

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')
            }
        }    
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Fel*_*lix 5

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

儿童无法直接访问该财产。附加属性需要由提供它们的类显式读取。对于您的示例,父类 ( StackView) 只需在添加子项 ( ) 后立即搜索它在子项 ( FirstView) 中提供的所有附加属性,并通过在内部将它们连接到提供它们的任何逻辑来处理所有找到的属性/信号等。

但是,只要您通过 id 引用它,就没有什么可以阻止您从父项获取附加属性:

sampleProp: view.StackView.someProperty
Run Code Online (Sandbox Code Playgroud)

问题是:这种间接访问仅适用于属性,不适用于信号,因为您不能简单地通过以下方式引用附加对象view.StackView- 遗憾的是,您只能通过创建第二个来间接将信号转发到子元素根项中的信号并在发出附加信号时发出它。