我使用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转换= item-> transform();

const int count = Transformations.count(&transformations);

//准备结果结构,它将默认初始化为一个单位矩阵
QMatrix4x4 transformMatrix;

//从项目开始顺序应用所有转换
for(int i = 0;我applyTo(&transformMatrix);
}

返回transformMatrix;
}

请注意,该函数以QMatrix4x4的形式返回一个转换矩阵-它比基于3x3转换矩阵的旧QTransform还要多,因此无法进行转换而不会造成损失。如果需要,可以使用QMatrix4x4::toAffine获取QMatrix(3x3)并使用它创建QTransform对象。但是,如果QQuickItem转换包含非亲和元素,则它们将丢失。

编辑

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

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

10-09 00:02