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