2

我有一个代表 s 列表的QAbstractListModel调用。每个人都有一个财产。模型的作用很简单,即一个实例。SerialPortListSerialPortSerialPortQList<int> supportedBaudRatesSerialPortListdisplayQVariant::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所以它认为它指的是它自己,但我已经尝试了各种portList.model.display.supportedBaudRates我能想到的 id 引用,但它们都不起作用。

编辑

卡卡杜指出,不能用 aQList<int>作为模型。有点烦人,但我已经把它改成了QStringList你显然可以使用的。可悲的是,错误仍然相同。

编辑 2

我更改了model:toComboBoxmodel: { console.log("model: " + model); }打印了1,这让我确信它model指的是它自己。

4

1 回答 1

0

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

幸运model.的是,它隐式地添加到委托中的任何变量访问之前,因此我将代码更改为此并且它起作用了:

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

(该...AsStrings财产是QStringList原始财产的副本QList<int>。)

于 2014-06-04T09:07:34.817 回答