Qt: изменение размера QGraphicsItem (boundingRect ()) в QGraphicsScene с помощью мыши

Я хотел бы изменить boundingRect() моего QGraphicsItem С помощью мыши.

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

но так как положение моего элемента определяется с верхней левой части boundingRect() сложнее изменить размер моего элемента, перемещая края, связанные с этой позицией.

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

вот часть моего кода:

void Myclass::mouseMoveEvent(QGraphicsSceneMouseEvent *event) 
{
    if(_resizemode) //if bottom selected
    {
        prepareGeometryChange();
        _h = event->pos().y();
    }

    if(_resizemode2) //if bottom right selected
    {
        prepareGeometryChange();
        _h = event->pos().y();
        _w = event->pos().x();

    }

    if(_resizemode3) //if right selected
    {
        prepareGeometryChange();
        _w = event->pos().x();
    }

    if(_resizemode4) //if top left selected HERE IS MY ISSUE
    {
        prepareGeometryChange();
        setPos(pos().x()+ event->pos().x(), pos().y() + event->pos().y());
        _h = _h - event->pos().y();
        _w = _w - event->pos().x();

    }

    if(!_resizemode&&!_resizemode2&&!_resizemode3&&!_resizemode4)
    {
    update();
    QGraphicsItem::mouseMoveEvent(event);
    }
}

_h и _w или высота и ширина, реализованные здесь:

QRectF Aabb::boundingRect() const
{
    return QRectF( 0, 0, _w, _h);
}

кто-нибудь знает как изменить размер QGraphicsItem выбор с помощью мыши каждого угла boundingRect() пожалуйста?

2 ответов


позиция моего элемента определяется в левом верхнем углу boundingRect ()

на мой взгляд, самый простой способ-изменить это так, чтобы позиция определялась центром элемента. Для этого определите исходную ограничивающую прямую как верхнюю левую (- w/2, -h/2) и нижнюю правую (w/2,h/2) или если вы возвращаетесь в функцию boundingRect QRectF(-w/2, -h / 2, w, h) для (x,y,w,h).

затем создайте дочерние элементы "инструмента" в углах, которые определяют область, по которой можно щелкнуть и перетащить углы исходного элемента. Вы можете захотеть, чтобы они просто появились, если элемент выбран.

в moveEvent дочернего элемента обновите ограничивающий прямоугольник основного элемента, чтобы он перемещался вместе с дочерним элементом. Когда мышь отпущена, пересчитайте boundingRect основного элемента, чтобы его центр все еще находился в (0,0).

Это можно сделать довольно легко, если вы сопоставите верхний левый и нижний правый boundingRect и преобразуйте их в координаты сцены, затем, используя ширину и высоту, повторно установите локальные координаты элемента так, чтобы он поддерживал (- w/2, -h / 2, w, h);


я решил свою проблему. Вот что я сделал до сих пор для mousePressEvent (определение исходного