用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
,正如这里所描述的,但它看起来有点笨拙,并不完全优雅。编辑:这应该工作,但我目前不能强迫它工作。
是否有一种方法来约束y轴的运动?(我还需要为滚动条创建结束点,但稍后。)
我对itemChange
类参考页中的代码进行了修改,并对其进行了增强,以便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通知,项的当前位置尚未改变,因此您可以在返回新值之前以任何方式操作新位置。
相关文章:
- 将对象移动到std::shared_ptr
- 何时在引用或唯一指针上使用移动语义
- 如何从具有移动语义的类对象中生成共享指针
- 将shared_ptr移动到<StructA>shared_ptr<变体<结构A、结构 B>>
- C / C++ 移位/偏移/向左或向右移动位图?
- MSVC将仅移动结构参数解释为指针
- 自定义先决条件对移动分配运算符有效吗
- 返回值优化:显式移动还是隐式
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 为什么复制而不是移动数据元素?
- 可以使用移动语义更改或改进此C++代码吗?
- 使lambda不可复制/不可移动
- c++在使用指针时移动语义
- 将QGraphicsItem的移动区域限制在多边形区域内
- SendInput()鼠标移动计算
- 按值 C++ 返回时进行双倍移动
- 如何知道在单独类中创建的 QGraphicsItem 是否已在场景中移动(更改其位置)?
- 为什么自定义QGraphicsItem会导致场景或视图移动,除非boundingRect为空
- 用mouseMoveEvent约束QGraphicsItem移动
- Qt:限制QGraphicsItem在另一个QGraphicsItem中的可移动区域