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

时间:2018-11-10 18:12:57

标签: qt qml attached-properties

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中进行一些清理。

我可以让视图发出自己的信号,并让代表响应该信号。但是我想知道的是,是否有一种方法可以连接到附加的信号:从另一个对象(listViewDelegate)激活StackView.onDeactivating。

1 个答案:

答案 0 :(得分:1)

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

不可能直接从孩子那里访问属性。附加属性需要由提供它们的类显式读取。以您的示例为例,父类(StackView)会在添加后立即在子项(FirstView)中搜索它确实提供的所有附加属性,并处理所有找到的属性/信号等。通过内部将它们连接到提供它们的逻辑上。

但是,只要您通过id引用它,什么都不会阻止您从父项获取附加属性:

sampleProp: view.StackView.someProperty

问题是:这种间接访问仅对属性和信号都有效,因为您不能简单地通过view.StackView引用附加的对象-遗憾的是,您一直将信号转发给通过在根项中创建第二个信号并在发出附加信号时发出第二个信号来间接创建子元素。