在使用QGraphicsItem绘制图形时,有时候需要限制拖动方式,如只能水平拖动或者只能垂直拖动。查找了一些资料,具体出处也不记得了,找到利用itemChange()函数限制移动位置的方法。
首先,继承要绘制的QGraphicsItem类,实现自己的类。设置flag如下:
setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemSendsGeometryChanges);
//QGraphicsItem::ItemIsSelectable表示item可选中
//QGraphicsItem::ItemIsMovable表示Item可移动
//QGraphicsItem::ItemSendsGeometryChanges使itemChange()函数有效。
其次,重载itemChange()函数。其中rect用来限制移动范围,高度设置为0则只能水平移动,宽度设置为0则只能垂直移动。
QVariant MyRectItem::itemChange(GraphicsItemChange change, const QVariant &value)
{
if (change == ItemPositionChange && scene())
{
QPointF newPos = value.toPointF();
QRectF rect(0, this->pos().y(), scene()->width(), 0); //水平移动
//QRectF rect(0, 0, 0, scene()->height()); //垂直移动
//QRectF rect(0, this->pos().x(), scene()->width(), 0); //向右下方移动
//QRectF rect(0, -this->pos().x(), scene()->width(), 0); //向右上方移动
if (!rect.contains(newPos))
{
newPos.setX(qMin(rect.right(), qMax(newPos.x(), rect.left())));
newPos.setY(qMin(rect.bottom(), qMax(newPos.y(), rect.top())));
return newPos;
}
}
return QGraphicsRectItem::itemChange(change, value);
}