我有一个最小的应用程序,可以模仿我的真实应用程序。我有一个带有列表视图列表模型的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 不允许在其中添加多余的属性别名。我该如何解决? 谢谢
答案 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定义的对象。