2011-12-18 50 views
3

我創建了一個實現QGraphicsItem的對象Chartblock。我的目標是創建這些對象的網格,並且當鼠標按鈕被按下(並且被保持)並且在每個塊上都是藥物時,當光標進入它時在每個塊上執行一些操作。Qt C++讓多個QGraphicsItem處理一個鼠標事件

由於QGraphicsItem在鼠標事件被點擊時捕獲鼠標事件,其他項目不會爲mouseMoveEvent觸發。然後我創建了一個基於QGraphicsItemGroup的對象來處理所有的鼠標事件,但是我需要一些方法將mousePressEvent/mouseReleaseEvent以及mouseMoveEvent傳遞給光標所在的每個孩子。

我是否過度如何做到這一點?看起來這樣一個簡單的動作不應該很難創建,但是使用QGraphicsItems來保存鼠標事件本身,我不知道如何繞過它。我讀過類似的情況,但似乎沒有提供直接的答案。

編輯:我想這樣做的方法將跟蹤我在數組中創建的每個QGraphicsItem的座標/大小,然後在組mouseMoveEvent中獲取光標的位置,並查看是否有命中。

+0

看樣子[這個舊的問題(http://stackoverflow.com/questions/3845615/detect-when-mouse-enter-qgraphicsitem-with-button-down)正是我想做的事情,但沒有提到真正的解決方案。 – giraffee 2011-12-18 18:09:07

回答

1

我能夠將幾個相似的答案放在一起來創建一個解決方案;我放棄了將所有QGraphicItem放在一個組中的想法,並將它們直接放在一個場景中。在場景抓住所有鼠標事件的情況下,我有mouseMoveEvent檢查來查看當前位置是否在QGraphicsItem之上 - 如果是,執行一些操作。

我仍然需要嘗試並獲取itemAt()爲我自己的類實現QGraphicsItem,因爲itemAt只返回QGraphicsItem的,但我相信一些強制轉型應該讓它工作。

void ChartScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event) 
{ 
    QPointF mousePosition = event->scenePos(); 
    QGraphicsItem* pItem = this->itemAt(mousePosition.x(), mousePosition.y()); 
} 
+0

關於您的答案中的問題:'itemAt()'返回一個QGraphicsItem,您可以在其中調用type(),這是一個虛擬函數,您可以在派生類中重寫該函數並返回指示您類類型的自定義值。 – 2012-11-22 15:18:02