QT QML Доступ к вложенному свойству из другого объекта QML - PullRequest
0 голосов
/ 10 ноября 2018

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')
            }
        }    
    }
}

У меня есть представление, которое создается StackView в main.qml. StackView присоединяет сигнал StackView.onDeactivating к представлению. Есть ли способ прикрепить к сигналу объект, отличный от того, к которому прикреплен сигнал? Мне нужно сделать некоторую очистку в listViewDelegate, когда представление выскочило.

Я мог бы, чтобы view испустил свой собственный сигнал, и чтобы делегат ответил на этот сигнал. Но что мне интересно, так это то, есть ли способ подключения к подключенному сигналу: StackView.onDeactivating из другого объекта (listViewDelegate).

1 Ответ

0 голосов
/ 12 ноября 2018

Да и нет. Документация Qt частично решает эту проблему: Замечание о доступе к присоединенным свойствам и обработчикам сигналов

Невозможно напрямую получить доступ к собственности от ребенка. Присоединенные свойства должны быть явно прочитаны предоставившим их классом. Например, родительский класс (StackView) просто ищет все вложенные свойства, которые он предоставляет в дочернем элементе (FirstView), как только он добавляется, и обрабатывает все найденные свойства / сигналы и т. Д., Подключая их внутренне. к любой логике, которая их обеспечивает.

Однако ничто не мешает вам получить прикрепленное свойство от родительского элемента, если вы обращаетесь к нему по id:

sampleProp: view.StackView.someProperty

Дело в том, что этот косвенный доступ работает таким образом только для свойств и сигналов, поскольку вы не можете просто сослаться на прикрепленный объект через view.StackView - к сожалению, вы застряли с передачей сигнала дочернему элементу. элементы косвенно, создавая второй сигнал в корневом элементе и испуская его, когда испускается прикрепленный сигнал.

...