Array 的 onChanged 属性在 QML 中的鼠标单击时在其中推送项目时不会被调用
Posted
技术标签:
【中文标题】Array 的 onChanged 属性在 QML 中的鼠标单击时在其中推送项目时不会被调用【英文标题】:Array's onChanged property doesn't get called when pushing items in it on mouseclicks in QML 【发布时间】:2014-06-12 05:35:25 【问题描述】:Access.qml
import QtQuick 2.0
Rectangle
id: newq
width: 100
height: 62
property var pp : [1]
onPpChanged:
console.log("\non pp changed, show pp's length: " + pp.length)
property int inde : 0
MouseArea
anchors.fill: parent
onClicked:
pp.push (inde++)
console.log("mousearea shows pp's length: " + pp.length)
main.qml
import QtQuick 2.0
Rectangle
id: root
width: 360
height: 360
Access
color: "red"
输出(鼠标点击):
QML debugging is enabled. Only use this in a safe environment.
on pp changed, show pp's length: 1
mousearea shows pp's length: 2
mousearea shows pp's length: 3
mousearea shows pp's length: 4
mousearea shows pp's length: 5
为什么我在 pp 中推送项目时没有调用 onPpChanged?我该怎么做才能调用它?
【问题讨论】:
【参考方案1】:这是因为 QML 中的数组不是 QML 对象。 documentation 说:
此外,由于 [...] 不是 QML 对象,因此更改它们的各个值不会触发属性更改通知。如果上面的示例有 onNumberChanged 或 onAnimalChanged 信号处理程序,它们就不会被调用。但是,如果项目或属性属性本身被重新分配给不同的值,则将调用此类处理程序。
因此,为了使您的代码正常工作,您需要在修改数组时自己抛出信号。所以你的代码应该是这样的:
MouseArea
anchors.fill: parent
onClicked:
pp.push(inde++);
ppChanged();
console.log("mousearea shows pp's length: " + pp.length);
【讨论】:
以上是关于Array 的 onChanged 属性在 QML 中的鼠标单击时在其中推送项目时不会被调用的主要内容,如果未能解决你的问题,请参考以下文章
QML - 访问存储在 QList 中的 QObject 类属性