Qt repatter:使用C++;作为模型的属性 我有C++属性 Q_PROPERTY(QList<qreal> XTickPos MEMBER _xTickPos);

Qt repatter:使用C++;作为模型的属性 我有C++属性 Q_PROPERTY(QList<qreal> XTickPos MEMBER _xTickPos);,qt,qml,qtquick2,Qt,Qml,Qtquick2,中继器看起来像这样 Item { anchors.fill: parent visible: true Repeater { model: pw.XTickPos.length Rectangle{ height: 50 width: 2

中继器看起来像这样

        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_可调用函数进行设置++

 Q_INVOKABLE QList<qreal> getXTickPositions();
并将QML属性xTickPos用作上面正在工作的中继器中的模型。我通过console.log检查了pw.XTickPos是否正确填充


我错过了什么?

这个有点棘手

该文档说明可以将JS数组用作模型,并说明当返回到QML时,
QList
会自动转换为JS数组

但似乎不能使用自动转换为JS数组作为模型的
QList
。想想看

当然,最好有一个适当的模型,带有适当的通知,以实现最高效率。但是,如果您确实想使用list属性,那么您似乎必须在getter中手动执行转换:

QVariantList model() {
  QVariantList vl;
  for (auto const & v : yourList) vl.append(v);
  return vl;
}
令人惊讶的是,虽然Qt据说会自动进行转换,但它似乎无法从
QList
生成
QVariantList


这是Qt为您准备的…

使用合适的型号,当添加元素时会通知中继器。如果QML不知道某个内容已添加到您的列表中,它将不会刷新。我认为如果它是Q_属性,它将在更改后自动发送信号?否。Q_属性的更好语法是:
Q_属性(键入name READ name WRITE setName NOTIFY nameChanged)
-您将在其中发出信号
nameChanged()
在setter中,
setName(…)
。然后你会发出一个信号。但也只有当你设置了一个新的列表时——而不是当你在列表中添加了一些东西时。如果您查看,您会发现QList甚至没有一个可以通知长度已更改的信号。由于QList不会通知所包含数据的更改,因此不建议将其用作模型(与QML/JS数组相同)。改用a。您可以在这里查看方便的QQmlObjectListModel:关于性能:使用完整模型的成本高吗?我这样问是因为我需要做的就是设置一些(例如10个)矩形,这需要快速更新,例如在窗口大小更改时。另外:除了通知之外,为什么我的上述方法不起作用?是的,我在阅读本文后选择了一个QList。感谢您的澄清。如果您不打算更改,您可以将Q_属性声明为常量。并且绑定它不会使Qt警告没有通知信号;)@detch,这种缺失的转换是新的,还是已经这样很久了?自较新版本以来,QML似乎区分了
属性var myArray
属性列表myList
(或类似的东西)-这可能会导致模型问题?这几天无法测试..我不知道。当它是一个属性时,可能转换不起作用。也许并非所有的转换都是“生而平等”。将getter更改为invokalbe也不起作用。Qt当然不会停止惊讶:D
 root.xTickPos=pw.getXTickPositions();
QVariantList model() {
  QVariantList vl;
  for (auto const & v : yourList) vl.append(v);
  return vl;
}