1

目标

我需要知道Foo的子类 的子类的集体几何形状何时以及如何QQuickItem变化。

问题

我已将 lambda 连接到QQuickItem::childrenRectChanged信号,但它从未发出。奇怪的是,如果我childrenRect在某个地方打电话,信号就会开始发出。childrenRect是一个 getter 方法,而不是一个 setter,所以我看不出这个“修复”的理由。

问题

为什么看似无关的调用“修复”了信号的发射,以及如何在不调用的情况下使其按预期工作childrenRect

可重现的例子

这是我准备演示该问题的示例:

Foo.h

#include <QQuickItem>

class Foo : public QQuickItem
{
    Q_OBJECT
public:
    explicit Foo(QQuickItem *parent = nullptr) :
        QQuickItem(parent) {
        childrenRect(); // After commenting this childrenRectChanged is not emitted anymore
        connect(this, &Foo::childrenRectChanged, [this](){
            qDebug() << childrenRect();
        });
    }
};

该类在main.cpp中注册,如下所示:

qmlRegisterType<Foo>("Foo", 1, 0, "Foo");

并以下列方式在main.qml中使用:

import QtQuick 2.15
import QtQuick.Window 2.15
import Foo 1.0

Window {
    width: 300; height: 400; visible: true; color: "black"
    title: qsTr("Children Rect")

    Foo {
        anchors.centerIn: parent

        Rectangle {
            anchors.bottom: lightMid.top
            anchors.horizontalCenter: parent.horizontalCenter
            width: 50; height: width; radius: 0.5*width
            color: "red"
        }

        Rectangle {
            id: lightMid

            anchors.centerIn: parent
            width: 50; height: width; radius: 0.5*width
            color: "yellow"
        }

        Rectangle {
            anchors.top: lightMid.bottom
            anchors.horizontalCenter: parent.horizontalCenter
            width: 50; height: width; radius: 0.5*width
            color: "green"
        }
    }
}

编辑

的文档QQuickItem::childrenRect 说:

此属性保存项目子项的集体位置和大小。

如果您需要访问项的子项的集体几何图形以正确调整项的大小,则此属性很有用。

访问功能:

QRectF childrenRect()

然而,正如@Amfasis 在评论中提到的,这个方法不仅仅是一个简单的getter。这里是the code

QRectF QQuickItem::childrenRect()
{
    Q_D(QQuickItem);
    if (!d->extra.isAllocated() || !d->extra->contents) {
        d->extra.value().contents = new QQuickContents(this);
        if (d->componentComplete)
            d->extra->contents->complete();
    }
    return d->extra->contents->rectF();
}
4

0 回答 0