使用 mouseMoveEvent 限制 QGraphicsItem 的移动
Constrain QGraphicsItem movement with mouseMoveEvent
我正在尝试适当地限制 QGraphicsItem
(特别是 QGraphicsRectItem
)的移动,而不更改本机行为以用作 X 轴上的滚动条。
我尝试覆盖 mouseMoveEvent
函数,但随后我需要重新编写矩形在 X 和 Y 方向上的行为。充其量,我可以使用鼠标将矩形捕捉到一个位置。 (此处矩形将捕捉,因此鼠标将其保持在中点):
void SegmentItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
setY(0);
setX(event->scenePos().x() - boundingRect().width()/2);
}
我现在正在查看 itemChange
,如 here 所述,但它看起来有点笨拙而且不够优雅。
编辑:这应该可以工作,但我目前无法强制它工作。
有没有办法只限制y轴的移动? (我还需要为滚动条创建止点,但稍后。)
我修改了 itemChange
Class 参考页中的代码,并对其进行了改进,使我的 QGraphicsRectItem
的所有四个角都在 QGraphicsScene
内:
QVariant SegmentItem::itemChange(GraphicsItemChange change, const QVariant &value)
{
if (change == ItemPositionChange && scene()) {
// value is the new position.
QPointF newPos = value.toPointF();
QRectF rect = scene()->sceneRect();
rect.setWidth(rect.width() - boundingRect().width());
rect.setHeight(0);
if (!rect.contains(newPos)) {
// Keep the item inside the scene rect.
newPos.setX(qMin(rect.right(), qMax(newPos.x(), rect.left())));
newPos.setY(2);
return newPos;
}
}
return QGraphicsItem::itemChange(change, value);
}
要回答关于将移动限制在一个方向上的问题的另一部分...使用与上述答案中相同的 itemChange 结构。您唯一需要做的额外事情是在归还物品之前将物品的当前 X 或 Y 坐标转移到新位置。此行允许 Y 跟踪鼠标,但保持 X 不变(即移动仅限于垂直方向):
newPos.setX (this->pos().x());
类似地,允许 X 跟踪鼠标,但保持 Y 不变(即移动仅限于水平方向):
newPos.setY (this->pos().y());
通过 ItemPositionChange 通知,项目的当前位置尚未更改,因此您可以在返回新值之前以任何方式操纵新位置。
我正在尝试适当地限制 QGraphicsItem
(特别是 QGraphicsRectItem
)的移动,而不更改本机行为以用作 X 轴上的滚动条。
我尝试覆盖 mouseMoveEvent
函数,但随后我需要重新编写矩形在 X 和 Y 方向上的行为。充其量,我可以使用鼠标将矩形捕捉到一个位置。 (此处矩形将捕捉,因此鼠标将其保持在中点):
void SegmentItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
setY(0);
setX(event->scenePos().x() - boundingRect().width()/2);
}
我现在正在查看 itemChange
,如 here 所述,但它看起来有点笨拙而且不够优雅。
编辑:这应该可以工作,但我目前无法强制它工作。
有没有办法只限制y轴的移动? (我还需要为滚动条创建止点,但稍后。)
我修改了 itemChange
Class 参考页中的代码,并对其进行了改进,使我的 QGraphicsRectItem
的所有四个角都在 QGraphicsScene
内:
QVariant SegmentItem::itemChange(GraphicsItemChange change, const QVariant &value)
{
if (change == ItemPositionChange && scene()) {
// value is the new position.
QPointF newPos = value.toPointF();
QRectF rect = scene()->sceneRect();
rect.setWidth(rect.width() - boundingRect().width());
rect.setHeight(0);
if (!rect.contains(newPos)) {
// Keep the item inside the scene rect.
newPos.setX(qMin(rect.right(), qMax(newPos.x(), rect.left())));
newPos.setY(2);
return newPos;
}
}
return QGraphicsItem::itemChange(change, value);
}
要回答关于将移动限制在一个方向上的问题的另一部分...使用与上述答案中相同的 itemChange 结构。您唯一需要做的额外事情是在归还物品之前将物品的当前 X 或 Y 坐标转移到新位置。此行允许 Y 跟踪鼠标,但保持 X 不变(即移动仅限于垂直方向):
newPos.setX (this->pos().x());
类似地,允许 X 跟踪鼠标,但保持 Y 不变(即移动仅限于水平方向):
newPos.setY (this->pos().y());
通过 ItemPositionChange 通知,项目的当前位置尚未更改,因此您可以在返回新值之前以任何方式操纵新位置。