2012-04-10 66 views
1

我有一個自定義的QGraphicsView和一個自定義的QGraphicsItem。如果點擊該項目,我希望項目處理我的點擊,否則我希望點擊由視圖處理。MousePressEvent中的視圖和項目Qt

但是,當我點擊該項目,該項目處理點擊。還行吧。但是,如果我點擊其他地方的點擊根本不處理。下面是我的類中與mouseEvent有關的所有代碼。

class CustomView : public QGraphicsView 
{ 
    Q_OBJECT 

public: 

    void mousePressEvent(QGraphicsSceneMouseEvent *event); 

}; 

void CustomView::mousePressEvent(QGraphicsSceneMouseEvent *event){ 
    cout << "pressing in view"; 
} 

class CustomItem : public QGraphicsItem 
{ 
public: 
    CustomItem(CustomView* widget) 
    void mousePressEvent(QGraphicsSceneMouseEvent *event); 
}; 

CustomItem::CustomItem(CustomView* widget){ 
    setFlag(ItemIsSelectable); 
    setFlag(ItemIsMovable); 
} 

void CustomItem::mousePressEvent(QGraphicsSceneMouseEvent *event){ 
    cout << "pressing in item"; 
} 

看來,當我從定製項目類和變化刪除mousePressEvent功能在CustomView的mousePressEvent功能:

void CustomView::mousePressEvent(QMouseEvent *event){ 
    cout << "pressing in view"; 
} 

的CustomView處理所有mouseEvents。

我該如何讓CustomItem處理項目中的點擊以及CustomView處理所有其他點擊?

謝謝。

編輯

所以,現在我已經把它改爲:

class CustomView : public QGraphicsView 
{ 
    Q_OBJECT 

public: 

}; 

class CustomScene : public QGraphicsScene 
{ 
protected: 
    void mousePressEvent(QGraphicsSceneMouseEvent *event); 
}; 


void CustomScene::mousePressEvent(QGraphicsSceneMouseEvent *event){ 
    cout << "pressing in scene"; 
} 

class CustomItem : public QGraphicsItem 
{ 
public: 
    CustomItem(CustomView* widget) 
protected: 
    void mousePressEvent(QGraphicsSceneMouseEvent *event); 
}; 

CustomItem::CustomItem(CustomView* widget){ 
    setFlag(ItemIsSelectable); 
    setFlag(ItemIsMovable); 
} 

void CustomItem::mousePressEvent(QGraphicsSceneMouseEvent *event){ 
    cout << "pressing in item"; 
} 

A單擊在現場,但沒有一個項目通過現場得到處理。但物品 中的點擊不會被物品本身處理,而是由場景處理。除非您在場景和物品處理的物品上快速點擊2次。

任何想法?

+0

嘗試重寫'QGraphicsScene :: mousePressEvent(QGraphicsSceneMouseEvent * MouseEvent)方法在QGraphicsScene'方法,而不是的QGraphicsView – Kunal 2012-04-10 04:26:49

+0

我想你 「CustomWidget :: mousePressEvent」 應該是 「CustomView :: mousePressEvent」(反之亦然)。 – Anthony 2012-04-10 04:42:37

+0

@Kunal Ty爲您的輸入,我將鼠標移動到現場,但我仍然有問題 – fibera 2012-04-10 17:22:40

回答

4

QGraphicsView並不是真正處理場景特定事件的好地方。相反,你需要重寫QGraphicsScene :: mousePressEvent。我建議是這樣的:

void CustomScene::mousePressEvent(QGraphicsSceneMouseEvent *event) 
{ 
    if (itemAt(event) == NULL) 
    { 
    // do stuff if not clicked on an item 
    } 
    else 
    { 
    QGraphicsScene::mousePressEvent(event); // this forwards the event to the item 
    } 
} 

注意QGraphicsScene :: itemAt可能,如果你有與ItemIgnoresTransformations標誌設置爲true的項目給你的困難。查看QGraphicsScene :: itemAt的文檔以瞭解如何解決此問題。

+0

好吧,所以我刪除了QGraphicsView :: mousePressEvent(QGraphicsSceneMouseEvent)並將該函數添加到自定義QGraphicsScene。現在,如果我點擊不在某個項目上的某個位置,該場景會處理我的點擊。如果我點擊一個項目,場景也會處理我的點擊。但是如果我在物品上點擊2次速度非常快,物品和場景就會處理我的點擊。 – fibera 2012-04-10 17:13:48

+0

@fibera我意識到我在答案中犯了一個錯誤。嘗試編輯的答案,讓我知道它是如何去。 – Anthony 2012-04-10 17:32:15

+0

這個技巧。泰您的時間和耐心。 – fibera 2012-04-10 17:59:27