QGraphicsItem.setTransformations не работает должным образом (также: расхождение между PySide2 и PyQt5) - PullRequest
1 голос
/ 05 марта 2020

Когда я пытаюсь добавить преобразование к 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? В последнем случае, как решить проблему, а для бонусных баллов - так, чтобы это работало для обоих пакетов?

1 Ответ

1 голос
/ 05 марта 2020

Чтобы узнать, какой из них правильный, необходимо проанализировать поведение исходного источника:

#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)"
...