当我尝试访问Tab元素的一个子元素时,如果它不活动,QML会抛出错误,说undefined
。
main.qml
import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Window 2.0
ApplicationWindow {
TabView {
Tab {
id: mytab1
}
Tab {
id: myTab2
Rectangle {
//(...)
}
}
}
Connections {
target: eventManager
onData: {
var scene = myTab2.children[0];
console.log(scene);
}
}
}
因此,如果myTab2处于活动状态,我可以在控制台QQuickItem_QML_15(0x27f1e2e0)
中看到。如果myTab2未激活,则qml会抛出TypeError: Cannot read property 'children' of undefined
。
如果选项卡未激活,为什么未定义?如何解决?
谢谢!
答案 0 :(得分:2)
在Qt documentation网站上,我找到了解决方案。
标签被延迟加载;只有当前的标签(for 例如,通过点击它们)将具有有效的内容。你可以强迫 通过将active属性设置为true来加载选项卡:
import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Window 2.0
ApplicationWindow {
TabView {
Tab {
id: mytab1
active: true
}
Tab {
id: myTab2
active: true
Rectangle {
//(...)
}
}
}
Connections {
target: eventManager
onData: {
var scene = myTab2.children[0];
console.log(scene);
}
}
}
所以,我在两个标签中添加了属性active: true
,它运行正常!
答案 1 :(得分:2)
在激活标签页之前,TabView
不会创建其内容项。
您的示例从标签1开始,此时标签2中的矩形不存在,因此您获得undefined
。如果激活选项卡2,将创建矩形,然后如果返回选项卡1,则不会获得undefined
。
Tab
继承Loader
,并附带active
属性。我想在Loader
组件中存在一个优化,以延迟加载直到元素变得可见。如果您在active: true
中设置了Tab
,则会在激活标签页之前加载它。请注意,这不会使标签视图打开,第二个标签处于活动状态。
Tab {
id: t2
active: true
Rectangle {
}
}