【问题标题】:QT QML Accessing Attached Property From Another QML ObjectQT QML 从另一个 QML 对象访问附加属性
【发布时间】:2019-04-13 23:34:40
【问题描述】:

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 from a different object (listViewDelegate)。

【问题讨论】:

  • 什么是myView?,请提供minimal reproducible example
  • 查看answer
  • @eylianesc 更正。
  • 还在纠正中..@Redanium 我对qml和js有基本的了解,这涉及到访问一个附加属性,这是一个qml概念。
  • @eyllanesc - 我可以通过将以下行添加到 FirstView.qml 来解决我的问题(以一种方式):信号隐藏(); StackView.onDeactivating: { hidden() },以及委托: Connections { target: view;隐藏:{ doSomething() }。如果你注意我的问题,你就会明白这一点。 FirstView 没有被 pop() 操作消除(还没有),这就是信号 StackView.onDeactivating 的目的。尊敬的,如果你花更少的时间试图“反驳”人们的问题,而花更多的时间试图理解他们在问什么,那将会更有帮助。

标签: qt qml attached-properties


【解决方案1】:

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

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

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

sampleProp: view.StackView.someProperty

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

【讨论】:

  • 好的,就是这样。 qml 中范围的细节相当复杂。谢谢。
猜你喜欢
  • 1970-01-01
  • 2012-01-25
  • 2017-02-27
  • 1970-01-01
  • 2021-03-22
  • 1970-01-01
  • 2016-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多