从 Delegate 访问 Listview currentIndex [英] Access Listview currentIndex from Delegate
问题描述
我有一个 QML ListView
,其中委托从另一个文件加载它的组件.单击委托项时,我想更新 ListView
.CurrentIndex
和 highlight
所选项目.
I have a QML ListView
where the delegate loads it's component from another file. When clicking on an delegate item, I want to update ListView
. CurrentIndex
and highlight
the selected item.
当我显式设置 ListView
的 id
时,它有效.但是,由于我想对其他 ListView
也使用委托的 Component
,我正在努力寻找一种通用的方法来访问 ListView.currentIndex
来自委托Component
.
It works, when I explicitly set the id
of the ListView
. However since I want to use the delegate's Component
also for other ListView
s, I'm stuggeling to find a generic way how to access ListView.currentIndex
from within a delegate Component
.
代码如下:
main.qml
import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Window 2.2
import QtQuick.Dialogs 1.2
ApplicationWindow {
title: qsTr("Hello World")
width: 640
height: 480
visible: true
ListModel {
id: contactsModel
ListElement {
name: "Bill Smith"
}
ListElement {
name: "John Brown"
}
ListElement {
name: "Sam Wise"
}
}
ListView{
id: contactsView
anchors.left: parent.left
anchors.top: parent.top
width: parent.width
height: parent.height
orientation: Qt.Vertical
spacing: 10
model: contactsModel
delegate: Contact{}
}
}
Contact.qml(委托使用的组件)
import QtQuick 2.0
Component{
id: contact
Rectangle{
width: 200
height: 50
color: ListView.isCurrentItem ? "#003366" : "#585858"
border.color: "gray"
border.width: 1
MouseArea{
anchors.fill: parent
onClicked: {
ListView.currentIndex = index; // <---- does not work
// contactsView.currentIndex = index; // <---- Works
}
}
Text{
anchors.centerIn: parent
color: "white"
text: name
}
}
}
非常感谢任何帮助!
推荐答案
这里有两个问题:
- 您需要使用从中访问它们的项目的名称来限定
ListView
的附加属性. currentIndex
属性是ListView
项目类型,而不是 附加的属性对象.
- You need to qualify
ListView
's attached properties with the name of the item from which they're accessed. - The
currentIndex
property is a property of theListView
item type, not the attached property object.
要同时修复它们,请先更改:
To fix them both, first change this:
ListView.currentIndex = index;
为此:
delegate.ListView.view.currentIndex = index;
然后给你的代表一个id
:
Component {
id: contact
Rectangle {
id: delegate
// ...
}
示例用法证明了这一点(部分)文档部分:
This is demonstrated (in part) by the Example Usage section of the documentation:
ListView 将许多属性附加到委托的根项目,例如 ListView:isCurrentItem.在以下示例中,根委托项可以直接作为 ListView.isCurrentItem 访问此附加属性,而子 contactInfo 对象必须将此属性引用为 wrapper.ListView.isCurrentItem.
ListView attaches a number of properties to the root item of the delegate, for example ListView:isCurrentItem. In the following example, the root delegate item can access this attached property directly as ListView.isCurrentItem, while the child contactInfo object must refer to this property as wrapper.ListView.isCurrentItem.
这篇关于从 Delegate 访问 Listview currentIndex的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!