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

3

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)。


1
什么是 myView?请提供一个 [mcve]。 - eyllanesc
@eylianesc 已经更正。 - Colin
@Colin 我认为你遇到了一个XY问题,你正在寻求一种可能有效的解决方案,而不是解决你真正的问题。那么你的真正问题是什么? - eyllanesc
@eyllanesc 所以,我认为在附加到的对象范围之外访问附加属性是不可能的。也许这就是我的答案。我已经阅读了关于qml的讨论,其中“私有”概念用于理解qml(例如在此处:http://doc.qt.io/archives/qt-4.8/qml-coding-conventions.html#private-properties)。如果有人想对这个问题发表意见,请随意发表。 - Colin
1
@eyllanesc - 我可以通过在FirstView.qml中添加以下行来解决我的问题(一种方式):signal hiding(); StackView.onDeactivating: { hiding() },并且在委托中:Connections { target: view; onHiding: { doSomething() }。如果您注意到我的问题,您就会理解这一点。FirstView尚未被pop()操作消除(尚未),这就是StackView.onDeactivating信号的目的。恕我直言,如果您花费更少的时间试图“反驳”人们的问题,并花更多的时间试图理解他们所问的问题,那将更有帮助。 - Colin
显示剩余11条评论
1个回答

5
是和不是。Qt文档部分涉及到了这个问题:关于访问附加属性和信号处理程序的说明
直接从子项中访问属性是不可能的。需要由提供它们的类显式读取附加属性。对于您的示例,父类(StackView)只需在子项(FirstView)添加时搜索其提供的所有附加属性,并通过内部连接将所有找到的属性/信号等处理逻辑提供给它们。
但是,只要通过ID引用,没有什么可以阻止您从父项获取附加属性:
sampleProp: view.StackView.someProperty

问题在于:这种间接访问只对属性有效,而不是对信号有效。您不能简单地通过 view.StackView 引用附加的对象,所以很遗憾,您只能通过在根项中创建第二个信号并在附加信号被触发时发射它,从而间接地将信号转发到子元素。

好的,没错就是这样。QML中作用域的细节相当复杂。谢谢。 - Colin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接