QML如何动态访问ListView项

时间:2016-09-07 20:26:40

标签: c++ qt listview qml

我有一个ListView,它有动态添加的项目,我想知道的是我如何通过索引访问项目。具体来说,我希望在使用“颜色”对话框更改颜色时更改项目矩形的颜色。我猜想应该可以在调用颜色对话框之前首先将变量设置为当前项目,然后在onAccepted方法中使用变量更改该项目的颜色,但我不知道如何实现任何这在QML中,因为我对QML很新。也许在关闭颜色对话框时(onAccepted),您可以提供更清晰的方式来更改项目矩形的颜色。感谢任何帮助! :)

import QtQuick 2.0
import QtQuick.Window 2.2
import QtQuick.Controls 1.4
import QtQuick.Dialogs 1.2
import QtQuick.Controls.Styles 1.4

Rectangle {
    id: listViewContainer
    width: parent.width/10*9;
    height: 50
    Behavior on height {
        NumberAnimation {
            duration: 100;
        }
    }

    gradient: Gradient {
        GradientStop {position: 0.0; color: "white" }
        GradientStop {position: 1.0; color: "silver" }
    }
    radius: 5
    ColorDialog {
        id: colorDialog
        title: "Please choose a color"
        onAccepted: {
            console.log("You chose: " + colorDialog.color)
            Qt.quit()
        }
        onRejected: {
            console.log("Canceled")
            Qt.quit()
        }
    }

    Component {
        id: playerDelegate
        Item {
            anchors.left: parent.left
            anchors.right: parent.right
            height: 50
            Column {
                Text { text: '<b>Name:</b> ' + name }
                Row {
                    MouseArea {
                        width: 20
                        height: 20
                        onClicked: {
                            colorDialog.visible = true;
                            playerColor = colorDialog.color;
                            //open color dialog
                        }

                        Rectangle {
                            radius: 3
                            anchors.fill: parent
                            color: playerColor
                        }
                    }
                }
            }
        }
    }

    ListView {
        id: playerListView
        anchors.fill: parent
        model:
            ListModel {
                id: playerListViewModel;
                ListElement {
                    name: "Bill Smith"
                    playerColor: "red"
                }
        }
        delegate: playerDelegate
    }
    Button {
        id: addPlayerButton
        anchors.top: playerListView.bottom
        anchors.left: playerListView.left
        anchors.right: playerListView.right
        style: ButtonStyle {
            label: Text {
                text: "Add new player"
                horizontalAlignment: Text.Center
            }
        }
        onClicked: {
            root.addnewPlayer(playerListView); //dont worry about this method
            playerListViewModel.append({name: "Billy", playerColor: "blue"});
            listViewContainer.height += 50;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

这是制作有效的colorDialog -

的可靠方法 在playerDelegate 中

 Component {
   id: playerDelegate
   Item {
     anchors.left: parent.left
     anchors.right: parent.right
     height: 50
     Column {
       Text {
         text: '<b>Name:</b> ' + name
       }

      /* Object to store value from color selector */
       Item {
         id: colorSelector


           property color color: "#000000"
           onColorChanged: { playerColor = color; }

       }
/* box to display color */
       Rectangle {

         //Layout.fillWidth: true
         height: 120
         width: 120
         anchors.left: button.right
           //Layout.alignment: Qt.AlignHCenter
         color: colorSelector.color
         border.width: 1
         border.color: "#000000"

       }
/* button to open dialog -- can be mousearea or other clickable object */

       Button {
         id: button
         text: "Browse..."
         onClicked: {
           colorDialog.color = colorSelector.color
           colorDialog.open()
         }
       }

/* actual color dialog for this delegate */




       ColorDialog {
         id: colorDialog
         modality: Qt.ApplicationModal
         title: "Please choose a color"
         onAccepted: colorSelector.color = currentColor
       }
     }
   }
 }
 



<小时/>