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 类属性

属性别名自引用?这个 QML 代码在做啥?

C++ 对象属性的 QML 属性

QML:在派生类中使属性只读

QML 和 C++ 属性 - ReferenceError:找不到变量

对象属性循环 (QML)