Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 选项卡组件的QML别名_Qt_Qml - Fatal编程技术网

Qt 选项卡组件的QML别名

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元素中的组件的别名,但没有成功。即使是这个小例子也不起作用:

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,其中存储了所有数据,并使用可视化表示绑定到它。因此,绑定由
选项卡
启动,以读取(并可能修改)
文本
。而您的另一个对象也对模型对象的相同属性执行相同的操作

模型不一定是某种类型的对象列表。可能就在路上