Repater:使用C ++属性作为模型

时间:2018-04-05 11:32:36

标签: qt qml qtquick2

我有一个C ++属性

 Q_PROPERTY(QList<qreal> XTickPos MEMBER _xTickPos);

我想在Repeater中使用它。在同一个QML文件中,c ++类被赋予了id

id: pw

转发器看起来像这样

        Item {
            anchors.fill: parent
            visible: true
            Repeater {
                model: pw.XTickPos.length
                Rectangle{
                    height: 50
                    width: 2
                    x: pw.XTickPos[index]
                    y:10
                    visible: true
                    color: "black"
                    border.width: 2
                }
              }
        }

但是,屏幕上没有任何内容。如果我在QML文件中创建属性:

 var xTickPos = []

并通过c ++中的Q_Invokable函数设置它

 Q_INVOKABLE QList<qreal> getXTickPositions();

和QML

 root.xTickPos=pw.getXTickPositions();

并使用QML属性xTickPos作为上述转发器中的模型。我检查了pw.XTickPos是否通过console.log正确填充

我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

这个有点棘手。

文档说明你可以使用JS数组作为模型,它确实说明QList<qreal>在返回QML时会自动转换为JS数组。

但似乎您无法使用自动转换为JS数组的QList<qreal>作为模型。去图......

当然,最好有一个合适的模型,并提供最佳效率的适当通知。但是如果你真的想去列表属性,看来你必须在getter中手动进行转换:

QVariantList model() {
  QVariantList vl;
  for (auto const & v : yourList) vl.append(v);
  return vl;
}

令人惊讶的是,虽然Qt可能会自动进行转换,但它似乎无法从QVariantList中获得QList<qreal>

那个Qt给你......