2012-03-02 47 views
2

我在寫一個使用Qt Graphics View框架的程序。我已將QGraphicsItem分類到包含其他QGraphicsItem(或其他子類)的類。此課程是包含的QGraphicsItem的母公司;這個想法是使用複合對象。如何將mousePressEvent()傳播到一組QGraphicsItems?

docs它似乎是在我做的嘗試,實現了衝突:

  • 調用ignore()mousePressEvent會讓我的對象不動。我想要移動它。
  • 調用accept() in mousePressEvent將防止事件傳播到子對象。一些子對象應該對鼠標事件作出反應。

我該如何做這項工作?

+1

您是否考慮過通過讓父處理程序調用QApplication :: postEvent將事件發送給每個項目的子項? – kenrogers 2012-03-02 13:08:30

+0

忽略我最後的評論。餿主意。請參閱下面的Styne答案。 – kenrogers 2012-03-02 13:16:36

+0

我現在正在嘗試:鼠標左鍵是移動動作的開始,所以它在'mousePressEvent()'中被接受並由對象處理。沒有其他對象會得到這個事件。對於其他輸入(右鍵,修飾鍵),該事件將被忽略,並將移動到下一個對象。 Stynes666是正確的,有沒有什麼意義的東西。 – 2012-03-06 13:31:25

回答

2

我認爲您對文檔的解釋不正確。

mousePressEvent中調用ignore()將使我的對象不可移動。

我不相信這是真的。對我來說,看起來好像調用ignore()就像是對象說:「我評估過這個事件,我已經採取了所有我想要回應這個事件的行爲,我也決定它不是爲我準備的,所以我現在通過它到我下面的下一個對象「。我找不到任何暗示忽略事件將會取消設置標誌(這是決定QGraphicsItem是否可移動的標誌)。

我不明白爲什麼你不能讓你的對象移動ignore()的事件,但我會建議,這不是一個明智的做法(在大多數情況下:很明顯,你可能有原因吧)。

調用accept()mousePressEvent將阻止事件傳播到子對象。

我相信這是真的,但父母仍然可以修改其子女。我的理解是打電話accept()就像是說「我已經評估過這個事件,我已經採取了所有我想要回應這個事件的行動(可能包括修改我的孩子),我也決定這個事件是給我的,所以我不會通過「。

+0

移動的問題是由於缺少鼠標移動事件造成的:「如果您在事件上調用QEvent :: ignore(),則此項目將失去鼠標抓取,並且事件將傳播到下面的任何最上面的項目。將交付給這個項目,除非收到新的鼠標按下事件。「 – 2012-03-02 14:26:12

+0

所以(假設你有充分的理由來回應一個事件**並且**說你忽略了它)在調用ignore之前執行你的迴應。 – 2012-03-02 14:46:54

+0

在按照建議通知孩子之後調用accept()(獲取mouseMoveEvents)會更有意義。我其實通過調用childrens mousePressEvent()方法來嘗試,但是因爲它們是受保護的成員。我相信我能找到解決方法,但看起來很難看。我的問題的主要動機是獲得更好的建議。 – 2012-03-02 15:23:53

0

在你父母的QGraphicsItem,你可以嘗試

MyObject::mousePressEvent (QGraphicsSceneMouseEvent * event) 
{ 
    QGraphicsItem::mousePressEvent(event); 
    event->ignore(); 
} 

這將使得鼠標事件的正常處理(即讓你的對象移動),但後來忽視它,使它傳播。

但是,邏輯需要更強大,因爲如果父母和孩子對相同的鼠標事件作出響應,副作用的風險很高。

+0

我試過這個,但問題是在你調用'ignore()'後,對象不會接收到更多的鼠標事件。這是移動的地方。 – 2012-03-02 14:29:34

0

QCoreApplication::postEvent(child, mouseEvent)發送給子對象。