如何处理从QGraphicsView和QGraphicsItem同时捕获的鼠标事件?

时间:2016-10-01 19:18:31

标签: c++ qt events

在此代码中,我需要在mousePressEvent(..) ItemcustomGraphicsView中执行不同的操作。重新定义QGraphicsView继承类中的鼠标事件处理程序会干扰QGraphicsItem如何将点击Itemview的操作分开,以便它们可以提供不同的行为?

class CustomGraphicsView: public QGraphicsView 
{
...
protected:
    void mousePressEvent(QMouseEvent * event);
};
class Item: public QGraphicsItem
{
protected:
   void mousePressEvent(QMouseEvent * event);
};
class customWidget: public QWidget 
{
public:
customWidget(QWidget * parent = 0) ;
...
private:
    customGraphicsView * view ;
    Item * item ;
};
customWidget::customWidget(QWidget* parent)
    :QWidget(parent)
{
view = new customGraphicsView(this) ;
item = new item; 

view->addItem(item) ;

}

3 个答案:

答案 0 :(得分:1)

您还需要了解QGraphicsView,QGraphicsScene和场景中的任何项目之间的事件处理。 QGraphicsView首先获取事件,将它们转换为场景事件,然后场景将它们传递给相应的项目。如果您没有看到您期望的活动,可能是因为您首先在其他地方拦截了该活动。我发现将调试语句放入每个事件处理程序非常有用,这样我就可以看到事件的来源以及它没有的位置。

答案 1 :(得分:0)

首先,您应该使用QGraphicsSceneMouseEvent代替QMouseEvent  for QGraphicsItem。

然后为每个mousePressEvent编写您自己的实现,例如:

void Item::mousePressEvent(QGraphicsSceneMouseEvent *event) {
   QGraphicsItem::mousePressEvent(event);
// do everything you was going to
}

void CustomGraphicsView::mousePressEvent(QMouseEvent *event) {
   QGraphicsView::mousePressEvent(event);
// do everything you was going to
}

答案 2 :(得分:0)

感谢您的回答,但我不得不删除QGraphicsItem鼠标事件并通过QGraphicsView实现代码

void CustomGraphicsView::mousePressEvent(QMouseEvent * event)
{
    Item * pressedItem ;

    pressPoint = event->pos();

    if(scene())
    {
        if (!items().isEmpty())
        {
            QPointF scenePoint = mapToScene(event->pos()) ;

            QGraphicsItem * item = scene()->itemAt(scenePoint, transform());


            if(pressedItem = dynamic_cast<Item*>(item))
            {
                //code for item press, instead of using QGraphicsItem::mousePressEvent(QGraphicsSceneMouseEvent * event)
                 pressedItem->setColor(Qt::red); 
           }
        }

     }

}