QML与众不同的TableViewColumn委托

时间:2018-02-14 13:49:25

标签: delegates qml tableview qtquickcontrols2

我有一个TableView个对象,它包含四个TableViewColumn个对象。

TableViewColumn个对象中的两个'代表是ComboBox

我希望第二个代表根据用户在第一个代理中的选择来更改其模型。我已经成功了。

但是,这会导致更改表中所有其他行的第二个委托模型。我希望此更改仅应用于相应的行,以便能够在每一行中具有不同的模型。

这可能发生吗?如果是这样,怎么样?

TableViewColumn{
            id: usageCol
            title: "Type"
            property string modelName: "Power Out"
            delegate: ComboBox {
                id: usageCombo
                model:
                    ListModel{
                    id: usageModel
                    ListElement { text: "PowerOut" }
                    ListElement { text: "AnalogOut" }
                    ListElement { text: "PwmOut" }
                    ListElement { text: "DigitalOut" }
                    ListElement { text: "BldcOut" }
                    ListElement { text: "AnalogIn" }
                    ListElement { text: "PwmIn" }
                    ListElement { text: "DigitalIn" }
                    ListElement { text: "Can" }
                }
                currentIndex: 0
                height: 16
                anchors.fill: parent
                onCurrentTextChanged: {
                    tableModel.setProperty(styleData.row,"use",currentText);
                    usageCol.modelName = currentText;
                }
            }
            width: tableConfig.width/tableConfig.columnCount
        }
TableViewColumn{
            id: pinCol
            title: "PIN"
            property string modelName: usageCol.modelName
            delegate: ComboBox {
                id: pinCombo
                model: {if (pinCol.modelName === "PowerOut") { modelPowerOut;}
                    else if (pinCol.modelName === "AnalogOut") { modelAnalogOut;}
                    else if (pinCol.modelName === "AnalogIn") { modelAnalogIn;}
                    else if (pinCol.modelName === "PwmOut") { modelPwmOut; }
                    else if (pinCol.modelName === "DigitalOut" || pinCol.modelName === "BldcOut" || pinCol.modelName === "DigitalIn") { modelDigitalBldc; }
                    else if (pinCol.modelName === "PwmIn") { modelPwmIn; }
                    else if (pinCol.modelName === "Can") { modelCan; }
                }
                /* Try Loader for delegate changing the model as needed. */
                height: 16
                anchors.fill: parent
                onCurrentTextChanged: {
                    tableModel.setProperty(styleData.row,"pin",currentText);
                }
            }
            width: tableConfig.width/tableConfig.columnCount
        }

[解决]

TableViewColumn{
            id: pinCol
            title: "PIN"
            delegate: ComboBox {
                id: pinCombo
                model:
                {
                    switch(tableModel.get(styleData.row).use){
                    case "PowerOut": return modelPowerOut
                    case "AnalogOut": return modelAnalogOut
                    case "AnalogIn": return modelAnalogIn
                    case "PwmOut": return modelPwmOut
                    case "DigitalOut" || "BldcOut" || "DigitalIn": return modelDigitalBldc
                    case "PwmIn": return modelPwmIn
                    case "Can": return modelCan
                    }
                }

                height: 16
                anchors.fill: parent
                onCurrentTextChanged: {
                    tableModel.setProperty(styleData.row,"pin",currentText);
                }
            }
            width: tableConfig.width/tableConfig.columnCount
        }

1 个答案:

答案 0 :(得分:0)

您不能使用modelName,因为它是整个列的公共属性。您应该依赖主TableView中的模型(对应于一行)。

删除所有modelName属性并使用tableModel.get(styleData.row).use代替pinCol.modelName可以解决您的问题。