选项卡未处于活动状态时的未定义元素
Undefined element when tab is not active
当我尝试访问 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
.
如果选项卡未激活,为什么是未定义的?我该如何解决?
谢谢!
从 Qt documentation 网站上,我找到了解决方案。
Tabs are lazily loaded; only tabs that have been made current (for
example, by clicking on them) will have valid content. You can force
loading of tabs by setting the active property to 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
,而且效果很好!
A TabView
在激活选项卡之前不会创建其内容项。
您的示例从选项卡 1 开始,此时选项卡 2 中的矩形不存在,因此您得到 undefined
。如果您激活选项卡 2,将创建矩形,然后如果您返回选项卡 1,您将不会得到 undefined
.
一个Tab
继承了一个Loader
,并附带了一个active
属性。我想 Loader
组件中存在一个优化,可以延迟加载直到元素变得可见。如果您在 Tab
中设置 active: true
,它将在激活选项卡之前加载。请注意,这不会使第二个选项卡处于活动状态时打开选项卡视图。
Tab {
id: t2
active: true
Rectangle {
}
}
当我尝试访问 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
.
如果选项卡未激活,为什么是未定义的?我该如何解决?
谢谢!
从 Qt documentation 网站上,我找到了解决方案。
Tabs are lazily loaded; only tabs that have been made current (for example, by clicking on them) will have valid content. You can force loading of tabs by setting the active property to 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
,而且效果很好!
A TabView
在激活选项卡之前不会创建其内容项。
您的示例从选项卡 1 开始,此时选项卡 2 中的矩形不存在,因此您得到 undefined
。如果您激活选项卡 2,将创建矩形,然后如果您返回选项卡 1,您将不会得到 undefined
.
一个Tab
继承了一个Loader
,并附带了一个active
属性。我想 Loader
组件中存在一个优化,可以延迟加载直到元素变得可见。如果您在 Tab
中设置 active: true
,它将在激活选项卡之前加载。请注意,这不会使第二个选项卡处于活动状态时打开选项卡视图。
Tab {
id: t2
active: true
Rectangle {
}
}