目标
我需要知道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();
}