QML 独特的 TableViewColumn 委托
QML Distinctive TableViewColumn Delegate
我有一个 TableView
对象,它由四个 TableViewColumn
对象组成。
两个 TableViewColumn
对象的代表是 ComboBox
。
我希望第二个委托根据用户在第一个委托中的选择更改其模型。我做到了。
但是,这会导致 table 的所有其他行中第二个代表的模型发生变化。我希望此更改仅应用于相应的行,以便能够在每一行中使用不同的模型。
这可能发生吗?如果是这样,怎么办?
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
}
您不能使用 modelName
,因为它是整个列的通用 属性。您应该依赖主要 TableView
中的模型(对应于一行)。
删除所有 modelName
属性并使用 tableModel.get(styleData.row).use
而不是 pinCol.modelName
应该可以解决您的问题。
我有一个 TableView
对象,它由四个 TableViewColumn
对象组成。
两个 TableViewColumn
对象的代表是 ComboBox
。
我希望第二个委托根据用户在第一个委托中的选择更改其模型。我做到了。
但是,这会导致 table 的所有其他行中第二个代表的模型发生变化。我希望此更改仅应用于相应的行,以便能够在每一行中使用不同的模型。
这可能发生吗?如果是这样,怎么办?
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
}
您不能使用 modelName
,因为它是整个列的通用 属性。您应该依赖主要 TableView
中的模型(对应于一行)。
删除所有 modelName
属性并使用 tableModel.get(styleData.row).use
而不是 pinCol.modelName
应该可以解决您的问题。