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