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);