QGraphicsItem.setTransformations 没有按预期工作(另外:PySide2 与 PyQt5 之间的差异)

QGraphicsItem.setTransformations does not work as expected (also: discrepancy between PySide2 vs PyQt5)

当我尝试向 QGraphicsItem 添加转换时,它没有显示在该对象的转换列表中:

from PySide2.QtWidgets import QGraphicsRectItem, QGraphicsScale

rect = QGraphicsRectItem()
rect.setTransformations([QGraphicsScale()])
n = len(rect.transformations())
assert n == 1, f'object has {n} transformations (expecting 1)'
# AssertionError: object has 0 transformations (expecting 1)    

令我惊讶的是,使用 PyQt5 时完全相同的代码可以按预期工作。

from PyQt5.QtWidgets import QGraphicsRectItem, QGraphicsScale
...
# No AssertionError

PyQt5 和 PySide2 之间的这种差异是怎么回事,是 PySide2 中的错误还是我使用 PySide2 错误?在后一种情况下,如何解决问题,并以适用于两个包的方式获得奖励积分?

要知道哪一个是正确的,必须分析原始来源的行为:

#include <QtWidgets>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QGraphicsRectItem rect;
    rect.setTransformations({new QGraphicsScale()});
    int n = rect.transformations().length();
    char message[80];
    sprintf(message, "object has %d transformations (expecting 1)", n);
    Q_ASSERT_X(n == 1, "QGraphicsItem::setTransformations()", message);
}

而且执行的时候,错误并没有解除,所以PyQt5有相应的行为。

在 PySide2 的情况下,它在处理未分配给变量的对象时存在问题,在这种情况下,解决方案是将列表分配给变量:

from PySide2.QtWidgets import QGraphicsRectItem, QGraphicsScale

rect = QGraphicsRectItem()
<b>transforms = [QGraphicsScale()]</b>
rect.setTransformations(<b>transforms</b>)
n = len(rect.transformations())
assert n == 1, f"object has {n} transformations (expecting 1)"