我有一个名为SerialPortList
的QAbstractListModel
,它代表SerialPort
s的列表。每个SerialPort
都有一个QList<int> supportedBaudRates
属性。SerialPortList
模型的display
角色只是QVariant::fromValue(mSerialPorts[i])
,即SerialPort
实例。
我在Repeater
中显示我的列表模型,像这样(高度简化):
SerialPortList {
id: ports
}
Column {
Repeater {
id: portList
// ...
model: ports
Text { text: model.display.portName }
ComboBox {
model: model.display.supportedBaudRates
// ...
}
}
}
即串行端口名称列表,然后是包含其支持波特率的组合框。
奇怪的是,虽然文本显示得很好,但显然对于组合框model.display
是未定义的。如果我将组合框替换为:
Text {
text: model.display.supportedBaudRates.join(" ")
}
那么它就会产生您所期望的结果!
这是怎么回事?我只能假设model
在ComboBox
内被重新定义,所以它认为它指的是自己,但我已经尝试了各种id引用,如portList.model.display.supportedBaudRates
,我能想到的,它们都不起作用。
编辑
Kakadu指出,你不能使用QList<int>
作为模型。有点烦人,但我已经把它改成了QStringList
,你显然可以使用。遗憾的是,错误仍然是相同的。
编辑2
我将ComboBox
中的model:
更改为model: { console.log("model: " + model); }
,它打印1
,这使我确保model
指的是自己。
我终于让它工作了!这只是一个名称空间问题——model
是一个神奇的变量,所以你不能在它上面使用id限定符。
幸运的是,model.
隐式地添加到委托中的任何变量访问,因此我将代码更改为此,它工作了:
ComboBox {
model: display.supportedBaudRatesAsStrings
// ...
}
(...AsStrings
属性是原QList<int>
属性的QStringList
副本)