试图使它在Qt 5.9版中正常工作
似乎每当我在QML Tab中创建对象时,父对象(或任何父对象的父对象,等等)都无法识别它。如何获取父对象以识别选项卡中的对象?或者,如果不可能的话,那么在Tab中调用对象功能的解决方法是什么?
我将代码简化为以下简化示例:
import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 1.4
Window {
Rectangle {
id: myFunctionCaller
Component.onCompleted: {
myParent.myFunction();
myChild.myFunction();
myGrandChild.myFunction();
}
}
TabView {
id: myParent
property Rectangle grandchild: myGrandChild
onGrandchildChanged: console.log("Parent recognizes GrandChild");
function myFunction() {
console.log("I'm the Parent");
}
Tab{
id: myChild
property Rectangle grandchild: myGrandChild
onGrandchildChanged: console.log("Child recognizes GrandChild");
function myFunction() {
console.log("I'm the Child");
}
Rectangle {
id: myGrandChild
function myFunction() {
console.log("I'm the GrandChild");
}
}
}
}
}
我希望此输出:
I'm the Parent
I'm the Child
I'm the GrandChild
Parent recognizes Grandchild
Child recognizes Grandchild
但是,我得到以下输出:
I'm the Parent
I'm the Child
ReferenceError: myGrandChild is not defined.
ReferenceError: myGrandChild is not defined.
ReferenceError: myGrandChild is not defined.
这些行出现错误:
myGrandChild.myFunction();
onGrandchildChanged: console.log("Parent recognizes GrandChild");
onGrandchildChanged: console.log("Child recognizes GrandChild");
答案 0 :(得分:1)
Tab
is a subclass of Loader
,因此Rectangle
直到Tab
处于活动状态时才创建。
标签被延迟加载;只有最新的标签(例如,通过单击它们)才具有有效的内容。您可以通过将active属性设置为 true
来强制加载标签
因此id: myGrandChild
仅在加载程序中自动创建的(源)组件中可用。
解决方案是激活标签页并使用myChild.item
来给孩子找地址
(未经测试)