【发布时间】:2021-11-04 03:40:32
【问题描述】:
设置
我有一个带有一些通用模型的ListView 和myDelegate 组件。
ListView {
id: myListView
delegate: myDelegate
...
}
在myDelegate组件中,我想设置ListView的currentItem。我目前是这样做的:
Component {
id: myDelegate
...
MouseArea {
onClicked: myListView.currentIndex = model.index
}
}
一切都按预期进行。
问题
众所周知,在委托中使用ListView 的id 是不好的做法,因为可能有多个ListView 使用同一个委托组件。因此,应该使用ListView.view 附加属性。
但如果我像这样更改委托的代码:
Component {
id: myDelegate
...
MouseArea {
onClicked: ListView.view.currentIndex = model.index
}
}
我收到了TypeError: Value is null and could not be converted to an object。
通过以下 console.logs,我发现 ListView.view 始终为空。我不明白为什么。在ListView 上设置currentIndex 本身也会失败。
onClicked: {
console.log("ListView:", ListView)
console.log("ListView.view:", ListView.view)
console.log("ListView.currentIndex:", ListView.currentIndex)
}
...
qml: ListView: QQuickListViewAttached(0x6db0b30)
qml: ListView.view: null
qml: ListView.currentIndex: undefined
最小的可重现示例
Qt v6.2.1
Qt Creator 中的空 Qt Quick 项目
main.qml:
import QtQuick
import QtQuick.Window
Window {
width: 150
height: 350
visible: true
Component {
id: myDelegate
Rectangle {
color: ListView.isCurrentItem ? "pink" : "lightblue"
implicitWidth: 150
implicitHeight: 50
MouseArea {
anchors.fill: parent
onClicked: {
ListView.view.currentIndex = model.index
console.log("ListView", ListView)
console.log("ListView.view", ListView.view)
}
}
Text {
anchors.centerIn: parent
text: model.index
}
}
}
ListView {
id: myListView
anchors.fill: parent
spacing: 2
model: 6
delegate: myDelegate
}
}
【问题讨论】:
-
@eyllanesc 已更新
-
MRE 必须在您的帖子中,所以我冒昧地复制了它。