在场景事件处理程序中更改QGraphicsItems位置?

时间:2013-11-24 20:05:04

标签: c++ qt qgraphicsitem

我正在使用

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'中描述的问题,即如何在没有子类化的情况下对多个项目进行共同处理他们......

非常感谢,

1 个答案:

答案 0 :(得分:0)

您在此问题中发布的代码是响应移动鼠标的事件。对于您要描述的内容,我建议您使用 QEvent :: GraphicsSceneMove 检查小部件的移动事件: -

if(event->type() == QEvent::GraphicsSceneMove)
{
    // set the position of the item.
}