我想使用鼠标调整boundingRect()
QGraphicsItem
的大小。
为了构建这个,我找到了这个topic。
所以我设法让我的boundingRect()
的权利,彻头彻尾和底部都按照这个主题的想法运作。
但由于我的项目位置是在boundingRect()
的左上角定义的,因此修改项目的大小会移动与此位置相关联的边缘会更复杂。
我尝试了左上角,但右下角也在移动。我想将右下角固定为仅改变大小而不是整个位置。
以下是我的代码的一部分:
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()
每个角落的鼠标大小吗?
答案 0 :(得分:1)
我的项目的位置是在boundingRect()
的左上角定义的
在我看来,最简单的方法是更改此位置,以便位置由项目的中心定义。为此,将原始边界矩形定义为左上角(-w / 2,-h / 2)和右下角(w / 2,h / 2),或者如果要在boundingRect函数中返回QRectF( - 对于(x,y,w,h),w / 2,-h / 2,w,h)。
然后,在角落创建子'工具'项目,这些项目定义了您可以单击的区域并拖动原始项目的角落。如果选择了该项,您可能希望这些只是出现。
在子项的moveEvent中,更新主项的边界矩形,使其随子项一起移动。释放鼠标时,重新计算主项的boundingRect,使其中心仍为(0,0)。
如果你映射boundingRect的左上角和右下角并将它们转换为场景坐标,然后使用宽度和高度,重新设置项目的本地坐标以便它维护( - w / 2,-h / 2,w,h);
答案 1 :(得分:1)
我解决了我的问题。以下是我到目前为止mousePressEvent
(定义原始boundingRect
函数,如QRectF(-w/2, -h/2, w, h)
)所做的事情:
void Myclass::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
if(isSelected())
{
qDebug()<<"isseldeted";
qreal adjust = 8;
if((event->pos().x() > boundingRect().left() + adjust) && (event->pos().x() < boundingRect().right() - adjust) && (event->pos().y() < boundingRect().bottom() + adjust) && (event->pos().y() > boundingRect().bottom() - adjust) )
{
_adj = event->pos().y();
_resizemode = true;
qDebug()<<"bottom";
}
if((event->pos().x() > boundingRect().right() - adjust) && (event->pos().x() < boundingRect().right() + adjust) && (event->pos().y() < boundingRect().bottom() + adjust) && (event->pos().y() > boundingRect().bottom() - adjust))
{
_adj = event->pos().y();
_adj2 = event->pos().x();
_resizemode2 = true;
qDebug()<<"bottom right";
}
if((event->pos().x() > boundingRect().right() - adjust) && (event->pos().x() < boundingRect().right() + adjust) && (event->pos().y() < boundingRect().bottom() - adjust) && (event->pos().y() > boundingRect().top() + adjust))
{
_adj2 = event->pos().x();
_resizemode3 = true;
qDebug()<<"right";
}
if((event->pos().x() > boundingRect().left() - adjust) && (event->pos().x() < boundingRect().left() + adjust) && (event->pos().y() > boundingRect().top() - adjust) && (event->pos().y() < boundingRect().top() + adjust))
{
_adj = event->pos().y();
_adj2 = event->pos().x();
_resizemode4 = true;
qDebug()<<"top left";
}
if((event->pos().x() > boundingRect().left() - adjust) && (event->pos().x() < boundingRect().left() + adjust) && (event->pos().y() < boundingRect().bottom() - adjust) && (event->pos().y() > boundingRect().top() + adjust))
{
_adj2 = event->pos().x();
_resizemode5 = true;
qDebug()<<"left";
}
if((event->pos().x() > boundingRect().left() - adjust) && (event->pos().x() < boundingRect().left() + adjust) && (event->pos().y() < boundingRect().bottom() + adjust) && (event->pos().y() > boundingRect().bottom() - adjust))
{
_adj = event->pos().y();
_adj2 = event->pos().x();
_resizemode6 = true;
qDebug()<<"bottom left";
}
if((event->pos().x() > boundingRect().left() + adjust) && (event->pos().x() < boundingRect().right() - adjust) && (event->pos().y() < boundingRect().top() + adjust) && (event->pos().y() > boundingRect().top() - adjust))
{
_adj = event->pos().y();
_resizemode7 = true;
qDebug()<<"top";
}
if((event->pos().x() < boundingRect().right() + adjust) && (event->pos().x() > boundingRect().right() - adjust) && (event->pos().y() < boundingRect().top() + adjust) && (event->pos().y() > boundingRect().top() - adjust))
{
_adj = event->pos().y();
_adj2 = event->pos().x();
_resizemode8 = true;
qDebug()<<"top right";
}
}
update();
QGraphicsItem::mousePressEvent(event);
}
和mouseReleaseEvent
:
void Myclass::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
if(_resizemode)
{
prepareGeometryChange();
_h += event->pos().y() - _adj; //good
setPos(pos().x(), pos().y() + (event->pos().y() - _adj)/2 );//good
_resizemode = false;
}
if(_resizemode2)
{
_h += event->pos().y() - _adj; //good
_w += event->pos().x() - _adj2;
setPos(pos().x() + (event->pos().x() - _adj2)/2, pos().y() + (event->pos().y() - _adj)/2 );//good
_resizemode2 = false;
}
if(_resizemode3)
{
_w += event->pos().x() - _adj2;
setPos(pos().x() + (event->pos().x() - _adj2)/2, pos().y());//good
_resizemode3 = false;
}
if(_resizemode4)
{
_h -= event->pos().y() - _adj; //good
_w -= event->pos().x() - _adj2;
setPos(pos().x() + (event->pos().x() - _adj2)/2, pos().y() + (event->pos().y() - _adj)/2 );//good
_resizemode4 = false;
}
if(_resizemode5)
{
_w -= event->pos().x() - _adj2;
setPos(pos().x() + (event->pos().x() - _adj2)/2, pos().y());//good
_resizemode5 = false;
}
if(_resizemode6)
{
_h += event->pos().y() - _adj;
_w -= event->pos().x() - _adj2;
setPos(pos().x() + (event->pos().x() - _adj2)/2, pos().y() + (event->pos().y() - _adj)/2);//good
_resizemode6= false;
}
if(_resizemode7)
{
_h -= event->pos().y() - _adj;
setPos(pos().x(), pos().y() + (event->pos().y() - _adj)/2);//good
_resizemode7= false;
}
if(_resizemode8)
{
_h -= event->pos().y() - _adj;
_w += event->pos().x() - _adj2;
setPos(pos().x() + (event->pos().x() - _adj2)/2, pos().y() + (event->pos().y() - _adj)/2);//good
_resizemode8= false;
}
update();
QGraphicsItem::mouseReleaseEvent(event);
}
mouseMoveEvent
也需要实施:
void Aabb::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{ if(!_resizemode&&!_resizemode2&&!_resizemode3&&!_resizemode4&&!_resizemode5&&!_resizemode6&&!_resizemode7&&!_resizemode8)
{
update();
QGraphicsItem::mouseMoveEvent(event);
}
}
问题在于我们没有看到移动中的大小调整:当我们释放鼠标时,我们会看到调整大小的项目。
有时项目没有完美重新定位,我不知道为什么。
所以这是有效的,但我相信它可以改进。