我想为StackView的不同页面实现键处理程序。StackView的问题在于它使用"item“属性来显示qml页面。因此,在StackView页面中声明的内容(例如HomePage.qml)对于main.qml是不可见的,因为它没有被显式实例化。
为了克服这个问题,我尝试在window中声明一个信号,并将其回调放在StackView页面中(这很愚蠢,但请建议您还能做些什么)。下面是它的大致外观:
main.qml
-----------
Window {
id: window
signal keyReceived();
property var key;
StackView {
id:stackView
initialItem: "HomePage.qml"
}
}
HomePage.qml
-------------
Page {
id: homePage
window.onKeyReceived:{
// Here "window" is not recognized, since this type of use does not exist?
}
}总而言之,我希望能够声明一个在main.qml和HomePage.qml中都可见的全局变量,并能够在该变量发生更改时发出通知。无论是信号还是其他东西,都无关紧要。任何帮助都是非常感谢的。
发布于 2020-05-05 21:29:57
这就是了:
Page {
id: homePage
Connections {
target: window
onKeyReceived: {
}
}
}这样做的原因是它在运行时通过StackView到Window使用QML上下文链来解析window id引用。
第一种方法不起作用的原因是,对当前类型之上的信号处理程序的引用不是静态可解析的。也就是说,QML不知道谁将在运行时成为Page的父对象,因此它不能解析window的类型,因此也不能解析信号keyReceived的类型和参数。这些类型的引用只适用于当前类型和在其下静态定义的所有子类型。
因此,每当你需要连接到一个QML不能确定其静态定义的类型时(比如上下文链上的引用),你必须使用一个Connections对象,它将在运行时解决所有这些问题。
https://stackoverflow.com/questions/61611821
复制相似问题