2010-08-10 127 views
4

對不起,我的初學者的問題... 什麼是最簡單的方法來定義過程,當MousePressEvent或MouseReleaseEvent發生時執行?在Qt中處理MouseEvents C++

現在我正在定義我自己的類(MyGraphicsView類),它繼承了QGraphicsView,我正在重新實現鼠標事件(這是虛函數)。它工作正常,但有沒有辦法解決這個問題,而不需要定義一個新的類? 我能以某種方式將事件與插槽連接起來嗎?

感謝您的幫助。

回答

4

This thread在Qt中心論壇上很好地描述了你的選擇。簡單地說:

  1. 你在做什麼(即子類化和重新實現)

  2. 與事件過濾器工作作爲其中的線程和鏈接描述。

+0

Marcin,在你的情況下,最好的方法是第二點(使用事件過濾器) – 2010-08-11 08:02:55

2

因爲鼠標事件是受保護的虛擬功能,所以最簡單的方法正是你在做什麼。我沒有看到爲什麼定義一個子類會導致問題的任何原因,所以我說堅持你擁有的。

如果您確實想要將事件與插槽相連接,則可以使您的子類實現mousePressEvent(),例如,簡單emit mousePressSignal()。當然,您還需要在子類頭的signals部分聲明mousePressSignal()

2

我可以看到重寫QGraphicsView::mousePressEventQGraphisView::mouseReleaseEvent沒有問題。整個事件處理概念是圍繞虛擬事件處理函數構建的。

此外,Qt documentation還建議「您可以通過創建QGraphicsView的子類並重新實現鼠標和鍵事件處理程序來提供您自己的自定義場景交互。」

0

從你的問題,

有沒有什麼辦法來 解決這個問題,而不必 定義一個新類?

答案是你不能

您必須從您想要處理事件的類繼承。

我可以以某種方式將事件與插槽 連接起來嗎?

您不能將事件連接到插槽,但只能將信號連接到插槽。

你現在正在做的方式是要做的。

+0

錯誤的,可以安裝事件過濾器,或者,對於QGRaphicsView,也可以安裝場景事件過濾器。 – 2010-08-10 14:58:27

+0

@ Frank,是的,你可以安裝事件過濾器,但你不能將事件連接到插槽。在事件處理程序中,你可以發出信號,但即使只有一個信號可以連接到插槽而不是事件.. – liaK 2010-08-11 04:58:23

0

您可以使用事件過濾器:見http://doc.qt.nokia.com/4.6/qobject.html#eventFilter 或者,在特定的圖形項目,http://doc.qt.nokia.com/4.6/qgraphicsitem.html#sceneEventFilter

注意,對於後者,一些事件改變:QMouseEvent成爲QGraphicsSceneMouseEvent例如,所以一定要篩選權類型。

什麼更容易,取決於具體情況。如果你有一個子類,重新實現虛擬方法通常比事件過濾方法更直接。但是,如果你想跟蹤幾個不同類的幾個小部件,並且需要對某個事件進行特殊處理,那麼子類化僅僅是爲了這個目的是乏味的,而不是一個好的設計(並且使得例如使用這些小部件的設計器更困難)。