在JavaScript中绑定动态创建的QML对象的属性时出现警告

在JavaScript中绑定动态创建的QML对象的属性时出现警告,qml,qt5,Qml,Qt5,Edit2:接受的答案说明了警告不应该造成那么大的问题。我改变了问题的主题,以便更好地反映问题的实际答案。它没有解决Edit1中提到的绑定问题,但是由于警告不再让我担心,使用绑定的主要原因不再相关 编辑:根据Praveen Kumar的建议,我创建了一个MVCE来说明问题。然而,代码现在似乎按预期工作!但是,由于所使用的方法在文档中有一个明确的警告,我在问题中添加了一个条件,即解决方案必须涉及绑定QML类型,这仍然是我不知道如何做的 修改原始问题:我有一些在QML中动态创建的对象,我想将这些对象

Edit2:接受的答案说明了警告不应该造成那么大的问题。我改变了问题的主题,以便更好地反映问题的实际答案。它没有解决Edit1中提到的绑定问题,但是由于警告不再让我担心,使用绑定的主要原因不再相关

编辑:根据Praveen Kumar的建议,我创建了一个MVCE来说明问题。然而,代码现在似乎按预期工作!但是,由于所使用的方法在文档中有一个明确的警告,我在问题中添加了一个条件,即解决方案必须涉及绑定QML类型,这仍然是我不知道如何做的

修改原始问题:我有一些在QML中动态创建的对象,我想将这些对象的一些属性绑定到静态对象的属性

我使用了一个ListModel来管理所建议的动态创建的对象

使用这个ListModel,我可以遍历所有对象并访问它们

同一个网站建议使用绑定属性,但我不知道如何使用它

我能够在没有绑定类型的情况下完成此工作,如下代码所示:

main.qml

import QtQuick 2.6
import QtQuick.Window 2.2
import QtQuick.Controls 2.1

Window {
    visible: true
    width: 640
    height: 480

    ListModel
    {
        id: listModel
    }

    Column
    {
        id: mainCol
        anchors.centerIn: parent
        spacing: 10

        Button
        {
            text: "Click to create object"

            onClicked:
            {
                var component = Qt.createComponent("Box.qml");
                var obj = component.createObject(mainCol);

                listModel.append({"obj": obj})
            }
        }

        TextField
        {
            id: inputTxt
        }

        Button
        {
            text: "Click to bind properties"

            onClicked:
            {
                for (var i = 0; i < listModel.count; ++i)
                {
                    var dynObj = listModel.get(i).obj;
                    dynObj.boxTxt = Qt.binding(function() {return inputTxt.text});
                }
            }
        }
    }
}
import QtQuick 2.0

Rectangle
{
    property alias boxTxt: txt.text

    width: 100
    height: 100
    color: "lightblue"

    Text
    {
        id: txt
        text: "Dynamic object"
    }
}
这正是我想要的,但是文档中有关于ListModel.get()的警告:

警告:返回的对象不保证保持有效。不应在属性绑定中使用它

这就是我正在做的

我不能用装订的方法把我的头包起来。我不是必须为每个Box组件动态创建一个新的绑定组件吗?这不会让我走得同样远吗

如果绑定不是实现这一点的方法,那么这也是一个有趣的答案


(另外,如果以这种方式编辑问题不是解决问题的方法,请在评论中告诉我)

很抱歉,我没有多少时间考虑您的尝试。。。我真的不明白,为什么要将可视对象添加到
列表模型中,但可能有原因

据我所知,你对警告的问题是:

警告:返回的对象不保证保持有效。不应在属性绑定中使用它

所以我想告诉你,你不应该因为这个警告而经历太多问题

让我们看看为什么(以及你在做什么)

在这里,您使用
mainCol
作为父对象创建对象。要销毁它,您需要销毁
mainCol
或显式调用对象上的
destroy()

只要不这样做,就不必担心create对象变得无效

现在,您将一个新的
JSObject
附加到
ListModel
中,其中包含对新创建项的引用

那么你有:

        onClicked:
        {
            for (var i = 0; i < listModel.count; ++i)
            {
                var dynObj = listModel.get(i).obj;
                dynObj.boxTxt = Qt.binding(function() {return inputTxt.text});
            }
        }
但你不能那样做。事实上,您使用的是对先前创建的项的引用,该引用填充在
ListModel
中,以绑定此
项的属性。为此,请在该行中阅读参考资料一次

var dynObj = listModel.get(i).obj;
现在,您不需要再为对象的生命周期操心了,该对象的任务是告诉您引用(由
listModel.get(i)
)返回),因为您已经分配(未绑定)了您想要的(
.obj
)。它可以死,如果它想,你继续绑定你想要的


如果不遵循确切的用例,
ObjectModel
可能(至少同样)满足您的需求。据我所知,这是在一个容器中存储对项目的引用。

您能提供吗。@PraveenKumar谢谢!我创建了一个MVCE,代码按预期工作。代码中肯定还有其他东西在起作用。但是,我认为我使用的方法不可靠,因此我相应地修改了问题。如果下面提到的描述回答了您的问题/疑问,请接受答案,以便其他人将来可以参考。我接受了它,并改变了问题的主题,以更好地反映这个答案,再次感谢你的帮助!谢谢非常有趣!我不确定我是否完全理解了,但是从您所说的,我理解get()返回对对象的引用,并且这个引用可能会被GC获取。但是,我只是使用这个引用来访问实际对象的属性(“在”引用后面),因此这不是问题吗?
var dObj = listModel.get(i)
property var x = Qt.binding(function() { return dObj })
var dynObj = listModel.get(i).obj;