gpt4 book ai didi

qt - 如何获得 QQuickItem 的变换矩阵?

转载 作者:行者123 更新时间:2023-12-02 03:51:31 24 4
gpt4 key购买 nike

我使用QGraphicsItem工作了很长时间,它有transform()函数。现在我不会对 QQuickItem 做同样的事情,但不幸的是它错过了 transform() 。所以我的问题 - 如何获得 QQuickItem 的变换矩阵?

最佳答案

实际上是QQuickItem提供transform()方法,但是它返回分配给给定项目的所有转换的列表。这是因为多个转换可以分配给单个 ItemQQuickItem::transform的返回类型是 QQmlListProperty<QQuickTransform> — 它是 QML list<Transform> 的包装器类型(参见 documentation for Item )。它可以被迭代,产生 QQuickTransform *元素。 QQuickTransform是提供虚拟方法的转换的基类 applyTo采取QMatrix4x4 *论证并对其应用变换。

QML 允许实例化多个 QQuickTransform子类(用于平移、旋转和缩放),并且允许用户定义自定义转换(例如,用于倾斜)。

要获得所需的单个变换矩阵,您必须从单位矩阵开始并顺序应用给定 QQuickItem 的所有变换。

QMatrix4x4 transformOfItem(QQuickItem *item){    QQmlListProperty transformations = item->transform();    const int count = transformations.count(&transformations);    // Prepare result structure, it will be default-initialized to be an identity matrix    QMatrix4x4 transformMatrix;    // Apply sequentially all transformation from the item    for(int i = 0; i applyTo(&transformMatrix);    }    return transformMatrix;}

请注意,该函数返回一个变换矩阵:QMatrix4x4 — 它不只是旧的 QTransform它基于 3x3 变换矩阵,因此无法无损转换。如果需要,您可以使用QMatrix4x4::toAffine获取QMatrix (3x3) 并用它来创建 QTransform目的。但是,如果您的QQuickItem转换包含非亲和元素,它们将会丢失。

编辑

还有一件事需要注意:我发布的方法仅适用于通过分配给 transform 定义的转换。属性(property)。它不检查 scalerotation特性。如果您使用它们,您应该使用适当的 QQuickItem 检查它们的值。方法并调整返回的矩阵以包含这两个附加转换。

关于qt - 如何获得 QQuickItem 的变换矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28535528/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com