QGraphicsItem: эмуляция источника элемента, который не находится в верхнем левом углу - PullRequest
4 голосов
/ 25 мая 2009

Мое приложение использует 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 упоминается, что положение элемента и его матрица преобразования - это две разные концепции.

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

Есть идеи?

Ответы [ 3 ]

4 голосов
/ 26 мая 2009

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

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

2 голосов
/ 25 мая 2009

Qt-документация о вращении :

void QGraphicsItem :: rotate (qreal angle)

Поворот текущего элемента угол преобразования градусов по часовой стрелке вокруг его происхождения. Для перевода вокруг произвольная точка (х, у), вам нужно объединить перевод и вращение с 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));
0 голосов
/ 25 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...