Вам нужно будет создать подкласс QGraphicsPathItem
и переопределить метод shape.Вот что я сделал, чтобы решить аналогичную проблему с незаполненным и заполненным прямоугольником.Этот частный случай подкласс от QGraphicsRectItem
.Это также имеет некоторую регулировку ширины пути, чтобы пользователю было легче щелкать, по существу, буферную зону вокруг пути.
В случае заполненного прямоугольника возвращаемая фигура представляет собой просто прямоугольник,но для незаполненного прямоугольника это обведенный путь с пустым внутренним пространством.Тогда объект перемещается только тогда, когда пользователь перетаскивает край, но не середину.Выяснить, что QPainterPathStroker
не было интуитивно понятно из документации, но на самом деле его было довольно просто использовать.
QPainterPath MyRectItem::shape (void) const
{
if (this->brush().style() != Qt::NoBrush)
{
return QGraphicsRectItem::shape();
}
// The rectangle is unfilled. Create a path outlining the rectangle.
QPainterPath path;
QRectF rect = this->rect();
path.moveTo (rect.topLeft());
path.lineTo (rect.topRight());
path.lineTo (rect.bottomRight());
path.lineTo (rect.bottomLeft());
path.lineTo (rect.topLeft());
QPainterPathStroker stroker;
if (this->pen().style() != Qt::NoPen)
{
// For easier selection, increase the pen width to provide a buffer zone
// around the line where the user can click and still select.
stroker.setWidth (this->pen().width() + 20);
stroker.setCapStyle (this->pen().capStyle());
stroker.setJoinStyle (this->pen().joinStyle());
}
return stroker.createStroke (path);
}