我正在使用
void QGraphicsItem::installSceneEventFilter(QGraphicsItem * filterItem);
在QgraphicsItem上设置事件过滤器(请参阅itemChanged() in QGraphicsItem for a many different items)
现在,对于其中一些项目,我想限制移动,即更改项目的x和y位置,以便在对象移动的某个区域限制用户。
我首先尝试使用以下命令修改事件:
(static cast <QGraphicsSceneMouseEvent*>(event))->setPos(QPoint(150, watched->y()));
整个处理程序:
bool generic_graphic_item::sceneEventFilter(QGraphicsItem* watched, QEvent* event)
{
if(event->type() == QEvent::QEvent::GraphicsSceneMouseMove)
{
(static_cast<QGraphicsSceneMouseEvent*>(event))->setPos(QPointF(150, watched->y()));
//emit my_item_changed(watched); // signal that the item was moved
emit(item_pos_changed(watched, watched->x(), watched->y()));
}
return false; // pass the event to the original target item
}
但它没有用。我不确定隐藏在QEvent::GraphicsSceneMouseEvent
后面的特定事件类。
然后我尝试在事件处理程序中调用watched->setX()
和watched->setY()
,但这不是很受欢迎......我能理解......
是否可以限制场景事件处理程序中的移动?
我已经读过可以使用QGraphicsItem::itemChange()
来做到这一点,但后来又回到了'itemChanged() in QGraphicsItem for a many different items'中描述的问题,即如何在没有子类化的情况下对多个项目进行共同处理他们......
答案 0 :(得分:0)
您在此问题中发布的代码是响应移动鼠标的事件。对于您要描述的内容,我建议您使用 QEvent :: GraphicsSceneMove 检查小部件的移动事件: -
if(event->type() == QEvent::GraphicsSceneMove)
{
// set the position of the item.
}