Qml委托在单独的文件上

时间:2018-12-04 18:40:28

标签: qt qml

我有一个最小的应用程序,可以模仿我的真实应用程序。我有一个带有列表视图列表模型的qml主窗口,并在同一文件中进行委托:

Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")

Component{
    id:deleg
    CheckBox{
        id:chk1
        contentItem: Text {
                id: txt
                anchors.left : parent.indicator.right
                anchors.leftMargin: 10
                anchors.verticalCenter: parent.verticalCenter
                text: dataname
                color: "blue"
            }}}

ListModel {
    id: mod
    ListElement{
        dataname :'here'
    }
    ListElement{
        dataname : 'there'
    }
}
ListView{
    id: view
    width: 200
    height:100
    anchors.left: parent.left
    anchors.top: parent.top
    model: mod
    delegate: deleg//CheckDelegate {}
}    }

main.cpp仅加载该qml文件,就像Qtcreator创建的标准空Qt Quick应用程序一样。

这将显示2个带有蓝色文本的复选框,很好。现在,如果我将委托人的代码放在一个名为 ChkDelegate 的新qml文件中,然后用对ChkDelegate的调用替换列表视图委托人(如上面的注释中所示),那么我将遇到1个问题,没有显示任何文本,据我了解,因为 dataname 无法解析。我尝试使用方括号中的链接,例如

CheckDelegate { txt : dataname }

但我无法访问 txt 属性,并且 Component 不允许在其中添加多余的属性别名。我该如何解决? 谢谢

2 个答案:

答案 0 :(得分:1)

首先,我将不使用CheckDelegate,因为它是Default Item,我将其名称更改为MyCheckDelegate。解决该问题认为MyCheckDelegate是一个组件,因此它必须是通用的,此外,在覆盖它时,您必须封装它,因此您不应使用数据名,而应使用相同的控件,因为id具有作用域,通常应创建一个属性将信息获取到外部并更新内部元素,但是在这种情况下,我们将利用CheckBox的text属性:

MyCheckDelegate.qml

import QtQuick 2.0
import QtQuick.Controls 2.4

CheckBox{
    id:control
    contentItem: Text {
        id: txt
        anchors.left : parent.indicator.right
        anchors.leftMargin: 10
        anchors.verticalCenter: parent.verticalCenter
        color: "blue"
        text: control.text
    }
}

*。qml

// ...
delegate: MyCheckDelegate{
    text: dataname
}
// ...

答案 1 :(得分:1)

CheckBox已经具有text属性,因此您可以从具有可见性的范围进行绑定:

  delegate: CheckDelegate { text: dataname }

Text元素中,您可以绑定到该元素:

text: chk1.text 

而且,将您的组件命名为与库存QML组件相同的名称也是一个非常糟糕的主意,因为这构成了命名冲突。您必须import储备QML模块as Identifier才能解决它,这并不理想。普通的QML组件似乎优先于用户定义的组件,但是即使不是,它们也不是理想的选择。因此,当实例化CheckDelegate时,您将不会创建自己定义的对象,而是创建一个Qt定义的对象。