我使用QGraphicsItem
工作了很长时间,它具有transform()
功能。现在,我不会对QQuickItem
做同样的事情,但是不幸的是,它错过了transform()
。所以我的问题-如何获得QQuickItem
的转换矩阵?
最佳答案
实际上QQuickItem
提供了transform()
方法,但是它返回分配给给定项目的所有转换的列表。这是因为可以将多个转换分配给单个Item
。 QQuickItem::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
属性定义的转换。它不检查scale
和rotation
属性。如果使用它们,则应使用适当的QQuickItem
方法检查它们的值,并调整返回的矩阵以包括这两个附加转换。
关于qt - 如何获得QQuickItem的变换矩阵?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28535528/