我试图在tab元素中包含一个组件的别名,但没有成功。即使这个小例子也不起作用:
Tab
{
id: tab1
title:'tab1'
property alias tab1Text: test.text
Text {
id:test
text:'Test123'
}
}
我收到了这个错误:
property alias tab1Text: test.text
有人可以告诉我问题在哪里,我该如何解决?
答案 0 :(得分:1)
您可以为Tab
的直接子项设置别名,因为默认情况下未加载其内容:
Tab项继承自Loader并提供类似的API。
标签被延迟加载;只有当前的标签(for 例如,点击它们)将有有效的内容。
您可以使用item
上的属性而不是别名:
Route::post('submitContact'
但是,只有加载了内容(当前标签或Tab {
id: tab1
title: 'tab1'
active: true
property string tab1Text: tab1.item ? tab1.item.text : ""
Text {
id: test
text: 'Test123'
}
}
),它才会被绑定到实际文本。
您还可以在内容周围添加active: true
:
Item
但是该别名之外的别名仍然不可用(包括选项卡的根目录)。
答案 1 :(得分:1)
由于您的别名声明的目标无效,因此会发生错误。
在QML中,您需要区分对象和组件,并且您拥有的内容并不总是对用户透明。
有时您可以在文档中找到sourceComponent
等属性sourceComponent: Component
如果您为其指定了内容,例如:
sourceComponent: Item {}
Item
不会被实例化。相反,此Component
的{{1}}是隐式创建的,然后可用于创建Item
。但由于还没有Item
的实例,您也无法访问此不存在的Item
中的任何属性。
然后在QML中你有一个名为Item
的东西
此属性是自动分配所有子对象的位置。
default property
和
Tab {
Item {}
}
是等价的。在大多数情况下,默认属性不是Tab {
sourceComponent: Item {}
}
类型,因此直接实例化分配的内容。
现在如何解决问题?您可以设置Component
并使用绑定读取或写入active: true
,但您仍然可以使用别名,因为别名的语法只允许theTab.item.theProperty
而不是{{1} }。
但设置id.property
意味着不仅会创建属性,还会创建通常不需要的所有可视项目。在我看来,最好的方法是保持数据和视觉表现彼此分离:
您可以拥有 ViewModel ,其中存储了所有数据,并使用可视化表示绑定到它。因此绑定由id.someProperty.someNestedProperty
启动以读取(并可能修改)active: true
。而你的另一个对象对模型对象的相同属性也是如此。
模型不一定是某种对象列表。它可能只是一个具有各种属性的对象,供您显示。
答案 2 :(得分:0)
您可以在Tab
中创建字符串属性并将Text.text
绑定到该属性。加载Tab的动态内容时会创建绑定。无需强制加载具有active
属性的选项卡。
TabView {
id: tabView
function setTab2Text(txt) {
tab2.tab2Text = txt
}
Tab
{
id: tab1
title:'tab1'
property string tab1Text: 'Test123'
Text {
id:test
text: tab1.tab1Text
}
}
Tab
{
id: tab2
title:'tab2'
property string tab2Text
Text {
id:test2
text: tab2.tab2Text
}
}
Component.onCompleted: setTab2Text('Test456')
}