Тянем за границу QGraphicsRectItem:
Делаем наследника от QGraphicsRectItem, пусть он будет называться text_rect_item
// в .h
enum resize_direction
{
rd_none,
rd_left,
rd_top,
rd_right,
rd_bottom
};
// добавляем в private:
resize_direction resize_direction_;
// в .cpp
void text_rect_item::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
QPointF p = event->pos();
QRectF r = sceneBoundingRect(); // relative to scene
QPointF tl = mapFromScene(r.topLeft());
QPointF br = mapFromScene(r.bottomRight());
if (p.x() <= tl.x()+3)
resize_direction_ = rd_left;
else if (p.x() >= br.x()-3)
resize_direction_ = rd_right;
else if (p.y() <= tl.y()+3)
resize_direction_ = rd_top;
else if (p.y() >= br.y()-3)
resize_direction_ = rd_bottom;
else
resize_direction_ = rd_none;
QGraphicsRectItem::mousePressEvent(event);
}
void text_rect_item::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
was_moved_ = true;
if (isSelected())
{
// resize border to mouse position
QPointF p = event->pos();
QPointF pp = mapToItem(this, p);
QRectF r = rect();
switch (resize_direction_)
{
case rd_left:
r.setLeft(pp.x());
setRect(r);
break;
case rd_top:
r.setTop(pp.y());
setRect(r);
break;
case rd_right:
r.setRight(pp.x());
setRect(r);
break;
case rd_bottom:
r.setBottom(pp.y());
setRect(r);
break;
default:
QGraphicsRectItem::mouseMoveEvent(event);
break;
}
return; // это главное, иначе item будет просто перемещаться вслед за курсором
}
QGraphicsRectItem::mouseMoveEvent(event);
}
если надо чтобы менялся курсор на границе, то переопределяем в наследнике QGraphicsView метод mouseMoveEvent
void page_view::mouseMoveEvent(QMouseEvent *event)
{
QGraphicsView::mouseMoveEvent(event);
QGraphicsItem* item = itemAt(event->pos());
if (item==0)
return;
QPointF p = event->pos(); // relative to page-view
QRectF r = item->sceneBoundingRect(); // relative to scene
QPointF tl = mapFromScene(r.topLeft());
QPointF br = mapFromScene(r.bottomRight());
if (p.x() <= tl.x()+3 || p.x() >= br.x()-3)
item->setCursor(Qt::SizeHorCursor);
else if (p.y() <= tl.y()+3 || p.y() >= br.y()-3)
item->setCursor(Qt::SizeVerCursor);
else
item->setCursor(Qt::SizeAllCursor);
}