dh1*_*1tw 5 qt qml qtquick2 qqmlcomponent
我有一个QML ListView,其中委托从另一个文件加载它的组件.单击委托项时,我想要更新ListView.CurrentIndex和highlight所选项目.
它工作,当我明确设置id的ListView.但是,由于我想将委托Component也用于其他ListViews,我正在努力寻找一种如何ListView.currentIndex从委托中访问的通用方法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{}
}
}
Run Code Online (Sandbox Code Playgroud)
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
}
}
}
Run Code Online (Sandbox Code Playgroud)
任何帮助真的很感激!
Mit*_*tch 12
这里有两个问题:
ListView使用访问它们的项目的名称限定附加属性.currentIndex属性是所述的属性ListView项目类型,而不是附加属性对象.要修复它们,首先要更改:
ListView.currentIndex = index;
Run Code Online (Sandbox Code Playgroud)
对此:
delegate.ListView.view.currentIndex = index;
Run Code Online (Sandbox Code Playgroud)
然后给你的代表一个id:
Component {
id: contact
Rectangle {
id: delegate
// ...
}
Run Code Online (Sandbox Code Playgroud)
这部分由文档的Example Usage部分演示:
ListView将许多属性附加到委托的根项,例如ListView:isCurrentItem.在以下示例中,根委托项可以直接以ListView.isCurrentItem的形式访问此附加属性,而子contactInfo对象必须将此属性称为wrapper.ListView.isCurrentItem.