簡體   English   中英

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

我可以讓視圖發出自己的信號,並讓委托響應該信號。 但是我想知道的是,是否有一種方法可以連接到附加信號:從另一個對象(listViewDelegate)調用StackView.onDeactivating。

是的,沒有。 Qt文檔部分解決了此問題: 關於訪問附加屬性和信號處理程序的說明

不能直接從孩子那里訪問酒店。 附加屬性需要由提供它們的類顯式讀取。 在您的示例中,父類( StackView )會在添加后立即在子項( FirstView )中搜索它確實提供的所有附加屬性,並通過將它們內部連接到提供的任何邏輯來處理所有找到的屬性/信號等。他們。

但是,只要您通過id引用它,什么都不會阻止您從父項獲取附加屬性:

sampleProp: view.StackView.someProperty

事實是:這種間接訪問僅對屬性和信號都有效,因為您不能簡單地通過view.StackView引用附加的對象-不幸的是,您只能通過view.StackView間接地將信號轉發給子元素:在根項目中創建第二個信號,並在發出附加信號時發出它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM