QGraphicsItem: эмуляция источника элемента, который не является левым верхним углом.

Мое приложение использует Qt.

У меня есть класс, который наследует QGraphicsPixmapItem.

При применении преобразований к этим элементам (например, вращений) исходной точкой элемента (или точкой поворота) всегда является верхний левый угол.

Я хотел бы изменить это происхождение, чтобы, например, при установке положения элемента это фактически изменило центр растрового изображения.

Или, если я применяю вращение, источником вращения будет центр растрового изображения.

Я не нашел способа сделать это прямо из коробки с помощью Qt, поэтому я решил повторно реализовать itemChange() следующим образом:

QVariant JGraphicsPixmapItem::itemChange(GraphicsItemChange Change, const QVariant& rValue)
{
    switch (Change)
    {
    case QGraphicsItem::ItemPositionHasChanged:
        // Emulate a pivot point in the center of the image
        this->translate(this->boundingRect().width() / 2,
                        this->boundingRect().height() / 2);
        break;
    case QGraphicsItem::ItemTransformHasChanged:
        break;
    }
    return QGraphicsItem::itemChange(Change, rValue);
}

Я думал, что это сработает, так как в документе Qt упоминается, что позиция элемент и его матрица преобразования — это два разных понятия.

Но это не работает.

Любая идея ?


person Jérôme    schedule 25.05.2009    source источник


Ответы (3)


Вы слишком много думаете об этом. QGraphicsPixmapItem уже имеет встроенную функциональность. См. метод setOffset.

Таким образом, чтобы установить начало элемента в его центре, просто делайте setOffset( -0.5 * QPointF( width(), height() ) ); каждый раз, когда вы устанавливаете растровое изображение.

person Parker Coates    schedule 26.05.2009
comment
Вы совершенно правы: я не видел этого свойства смещения. Это именно то, что мне нужно. Мое приложение теперь работает так, как ожидалось. Спасибо ! - person Jérôme; 26.05.2009

Документация Qt о ротации:

void QGraphicsItem::rotate ( qреальный угол )

Поворачивает угол преобразования текущего элемента по часовой стрелке вокруг его исходной точки. Для перемещения вокруг произвольной точки (x, y) необходимо объединить перемещение и вращение с помощью setTransform().

Пример:

// Rotate an item 45 degrees around (0, 0).
item->rotate(45);

// Rotate an item 45 degrees around (x, y).
item->setTransform(QTransform().translate(x, y).rotate(45).translate(-x, -y));
person Georg Schölly    schedule 25.05.2009
comment
На самом деле я нашел это в документе, но я не упомянул в своем вопросе, что хочу использовать QGraphicsItemAnimation, для которого нет метода setTransformAt(), только setPosAt, setRotationAt и т. д. - person Jérôme; 26.05.2009

Вам нужно создать функцию поворота, которая переводит объект в угол родителя (0, 0), выполняет поворот и перемещает объект в исходное местоположение.

person Jesus Fernandez    schedule 25.05.2009