2016-10-01 81 views
0

在此代碼中,我需要在mousePressEvent(..)ItemcustomGraphicsView中執行不同的操作。如何分開Itemview的動作,以便它們可以給出不同的行爲?QGraphicsView繼承的類干擾了QGraphicsItem的鼠標事件處理程序的重新定義。如何同時處理從QGraphicsView和QGraphicsItem中捕獲的鼠標事件?

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) ; 

} 

回答

0

起初,你應該使用的QGraphicsSceneMouseEvent代替QMouseEvent 爲的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 
} 
0

您還需要了解該事件的的QGraphicsView的QGraphicsScene,在任何項目之間處理現場。 QGraphicsView首先獲取事件,將它們轉換爲場景事件,然後場景將它們傳遞給適當的項目。如果您沒有看到您期望的事件,那可能是因爲您先在其他地方攔截了它。我發現將調試語句放入每個事件處理程序中非常有用,這樣我就可以看到事件發生在哪裏以及哪裏沒有發生。

0

感謝您的回答,但我不得不刪除的QGraphicsItem鼠標事件僅實現這樣

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); 
      } 
     } 

    } 

} 
通過的QGraphicsView代碼