ChildrenRect始终返回0

时间:2017-07-13 18:53:57

标签: qt qml qt5.8

我有一个Flickable项目,我想放置一个自定义的流程组件,所以我创建了这样的Flickable:

import QtQuick 2.0
import UICore.Layouts 1.0 as Layouts
Flickable{
    anchors.fill: parent;
    contentWidth: parent.width;
    contentHeight: flow.childrenRect.height;

    Component.onCompleted: {
        console.log("The content height is: " + contentHeight);
    }


}

然后在我的main.qml中我有这个(上面的文件是MyFlickable,MyFlow是一个具有特定属性的流):

 MyFlickable{
        ....
        MyFlow{
            id: flow
         ... 
        }
  }

这很好用,但问题是我希望能够以尽可能少的开销重用此项。在我的MyFlow中设置id不起作用,我尝试了这个

contentHeight: contentItem.childrenRect.height

如contentWidth部分所述:http://doc.qt.io/qt-5/qml-qtquick-flickable.html#contentItem-prop

但总是返回0.我已尝试了几种其他方式来接收onCompleted信号,但我得到了同样的运气。例如,这不起作用:

contentHeight: children[0].childrenRect.height

在我看来,这应该与通过id访问项目相同,显然不是。

所以我的问题是:在添加所有组件后,如何获得流量的高度?

提前致谢!

1 个答案:

答案 0 :(得分:1)

这将实现你想要的目标:

contentHeight: contentItem.children[0].childrenRect.height

来自Qt docs

  

声明为Flickable子级的项目自动成为Flickable的contentItem的父级。在操作Flickable的孩子时应该考虑到这一点;它通常是contentItem的子项是相关的。

但我必须说,组件对自己的QML文件之外的事物进行假设是不好的做法,因为它使组件难以重用。特别是在这种情况下,Flickable假设其第一个子元素是使用childrenRect属性的Component类型。您的MyFlow组件可以,但许多其他组件不会,例如Image。