Get data of the ListElement, which is currently bound to the TableView



  • Hello All,

    I am trying to achieve the following: Add a table, which will have one column with delegates (TextFields, SpinBoxes, etc) and the rest of the columns will be just texts, taken from ListModel. What control will be added on the current row depends on one of the properties in the ListModel. I am adding the controls by a Loader and I have a script, which returns a delegate of the respective control. In order to decide which element to put in the current row, I need to know the value of the ListElement's property in the current row. This is my code:

     Item {
                id: propertiesTableContainer
                anchors.top: propertiesFilter.bottom
                anchors.topMargin: 10
                anchors.bottom: parent.bottom
                width: parent.width
    
                Item {
                    id: propertiesDelegatesContainer
    
                    Component {
                        id: propertiesTextBoxDelegate
                        TextField {}
                    }
    
                    Component {
                        id: propertiesSpinBoxDelegate
                        SpinBox {
                            stepSize: lStepSize
                            decimals: lDecimalCounts
                        }
                    }
    
                    Component {
                        id: propertiesCheckboxDelegate
                        CheckBox {}
                    }
                }
    
                ListModel {
                    id: propertiesModel
    
                    ListElement {
                         name: "gAudioSongTitle"
                         value: ""
                         description: "The title of currently playing song"
                         type: "String"
                         range: ""
                    }
    
                    ListElement {
                         name: "gAudioSongTotalTime"
                         value: ""
                         description: "The title of currently playing song"
                         type: "Int"
                         range: ""
                    }
    
                    ListElement {
                         name: "gAudioSongTotalTime"
                         value: ""
                         description: "The title of currently playing song"
                         type: "Bool"
                         range: ""
                    }
    
                    ListElement {
                         name: "gAudioSongTotalTime"
                         value: ""
                         description: "The title of currently playing song"
                         type: "float"
                         range: ""
                    }
                }
    
                TableView {
                    id: propertiesTable
                    anchors.top: parent.top
                    anchors.bottom: parent.bottom
                    model: propertiesModel
                    width:parent.width
    
                    TableViewColumn {
                        id: propertiesColumnName
                        role: "name"
                        title: "Name"
                        elideMode: Text.ElideRight
                        width: 100
                    }
                    TableViewColumn {
                        id: propertiesColumnValue
                        role: "value"
                        title: "Value"
                        width: 200
    
                        delegate: Loader {
                            anchors.fill: parent
                            property real lStepSize: 0.1
                            property int lDecimalCounts: 1
    
                            sourceComponent: {
                                switch(propertiesModel.get(0).type)
                                {
                                    case "String":
                                    case "string":
                                        console.log(lPropertiesTableCurrentRow);
                                        return propertiesTextBoxDelegate;
                                    case "Int":
                                    case "int":
                                    case "Int32":
                                    case "int32":
                                        console.log(lPropertiesTableCurrentRow);
                                        lStepSize = 1.0;
                                        lDecimalCounts = 0;
                                        return propertiesSpinBoxDelegate;
                                    case "Float":
                                    case "float":
                                    case "Double":
                                    case "double":
                                    case "Real":
                                    case "real":
                                        console.log(lPropertiesTableCurrentRow);
                                        lStepSize = 0.1;
                                        lDecimalCounts = 1;
                                        return propertiesSpinBoxDelegate;
                                    case "Boolean":
                                    case "Bool":
                                    case "bool":
                                        console.log(lPropertiesTableCurrentRow);
                                        return propertiesCheckboxDelegate
                                    default:
                                        console.log(lPropertiesTableCurrentRow);
                                        return propertiesTextBoxDelegate;
                                }
                            }
                        }
                    }
                    TableViewColumn {
                        id: propertiesColumnDescription
                        role: "description"
                        title: "Description"
                        elideMode: Text.ElideRight
                        width: 200
                    }
                    TableViewColumn {
                        id: propertiesColumnType
                        role: "type"
                        title: "Type"
                        elideMode: Text.ElideRight
                        width: 100
    
                    }
                    TableViewColumn {
                        id: propertiesColumnRange
                        role: "range"
                        title: "Range"
                        elideMode: Text.ElideRight
                        width: 100
                    }
                }
    
            }
    

    As you can see I am trying to get the value by this expression:

    propertiesModel.get(0).type
    

    I need either to replace the 0 with the index of the currently processed ListElement or find another way to get the data from the type column. I tried to use on global property, which starts at 0 and I increase it by one everytime a delegate is loaded, but then I've got Binding Loop error. It was like this:

    propertiesModel.get(globalProperty++).type
    

    So, is it possible to achieve what am I trying to, or should I try to find another way (without using TableView)

    Thanks,



  • Make switch statement like this. It should solve your problem.

    switch(propertiesModel.get(styleData.row).type)



  • A huuuuuge thanks, @dheerendra . You really saved my day :)


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.