QML选项卡组件的别名

时间:2018-04-09 08:45:51

标签: qt qml

我试图在tab元素中包含一个组件的别名,但没有成功。即使这个小例子也不起作用:

Tab 
{
    id: tab1
    title:'tab1'

    property alias tab1Text: test.text

    Text {
        id:test
        text:'Test123'
    }    
}

我收到了这个错误:

property alias tab1Text: test.text

有人可以告诉我问题在哪里,我该如何解决?

3 个答案:

答案 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')
}