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 中进行一些清理。
我可以让视图发出自己的信号,并让委托响应该信号。但我想知道是否有一种方法可以连接到附加信号:StackView.onDeactivating 来自不同的对象 (listViewDelegate)。
是也不是。 Qt 文档部分解决了这个问题:A Note About Accessing Attached Properties and Signal Handlers
不可能直接从child访问属性。附加属性需要由提供它们的 class 显式读取。对于您的示例,parent class (StackView
) 只需搜索它在 child 项 (FirstView
) 中提供的所有附加属性被添加,并通过在内部将它们连接到提供它们的任何逻辑来处理所有找到的 properties/signals 等。
但是,只要您通过 id:
引用它,没有什么能阻止您从 parent 项目中获取附加的 属性
sampleProp: view.StackView.someProperty
问题是:这种间接访问仅适用于属性而不适用于信号,因为您不能简单地通过 view.StackView
引用附加的 object - 很遗憾,您是通过在根项中创建第二个信号并在附加信号被发射时发射它,坚持将信号间接转发到 child 元素。
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)。
是也不是。 Qt 文档部分解决了这个问题:A Note About Accessing Attached Properties and Signal Handlers
不可能直接从child访问属性。附加属性需要由提供它们的 class 显式读取。对于您的示例,parent class (StackView
) 只需搜索它在 child 项 (FirstView
) 中提供的所有附加属性被添加,并通过在内部将它们连接到提供它们的任何逻辑来处理所有找到的 properties/signals 等。
但是,只要您通过 id:
引用它,没有什么能阻止您从 parent 项目中获取附加的 属性sampleProp: view.StackView.someProperty
问题是:这种间接访问仅适用于属性而不适用于信号,因为您不能简单地通过 view.StackView
引用附加的 object - 很遗憾,您是通过在根项中创建第二个信号并在附加信号被发射时发射它,坚持将信号间接转发到 child 元素。