模型内的QML模型是未定义的

时间:2014-06-03 14:27:47

标签: qml qt5 qt-quick qabstractlistmodel

我有QAbstractListModel名为SerialPortList,代表SerialPort的列表。每个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

我将model:中的ComboBox更改为model: { console.log("model: " + model); }并打印1,这使我确保model引用自身。

1 个答案:

答案 0 :(得分:0)

哦,我终于开始工作了!它只是一个命名空间问题 - model是一个神奇的变量,所以你不能使用id限定符。

幸运的是,model.隐式地被添加到委托中的任何变量访问中,因此我将我的代码更改为此并且它有效:

    ComboBox {
        model: display.supportedBaudRatesAsStrings
        // ...
    }

...AsStrings属性是原始QStringList属性的QList<int>副本。)