2011-01-07 56 views
11

我有一個QAbstractItemView需要對單擊和雙擊事件做出反應。這些操作根據是單擊還是雙擊而不同。發生的問題是在雙擊事件之前接收到單擊事件。區分Qt中的單擊事件和雙擊事件

是否有推薦的方法/最佳實踐區分兩者?當用戶實際上雙擊時,我不想執行單擊操作。

我使用Qt 4.6

回答

6

你可以找到在QtCentre論壇題爲Double Click Capturing線程的答案;

你可以有一個計時器。在releaseEvent處理程序中啓動 計時器,並確保 的超時時間足夠長,以便首先處理雙擊。 然後,在雙擊事件 處理程序中,您可以停止計時器,並且 可以防止它被觸發。如果雙擊 點擊處理程序未觸發,則 計時器將超時並調用您所選擇的 插槽,您可以在其中處理 單擊。這當然是一個令人討厭的黑客攻擊,但有機會工作。

wysota

+0

它可以工作,但當它單擊時會在用戶體驗上造成延遲。無論單擊會發生什麼,都會花費很長時間(QApplication :: doubleClickInterval()),所以應用程序看起來很慢。儘管如此,除了比爾的答案之外,我不能想出更好的解決方案。 – 2016-11-18 12:27:34

9

這是一個很好的用戶界面設計,以確保您的單次點擊和雙擊在概念相關:

Single-Click: select icon 
Double-Click: select icon and open it 

Single-Click: select color 
Double-Click: select color and open palette editor 

請注意,在這些例子中,單一的點擊動作實際上是雙擊的一個子集。這意味着你可以繼續正常地做你的單擊動作,只是做了額外的行動,如果雙擊進來

如果您的用戶界面確實是這樣的:。

Single-Click: select icon 
Double-Click: close window 

那你就將用戶設置爲失敗。即使他們記得單擊操作與雙擊雙擊,但在雙擊或等待時間過長時,意外移動鼠標太容易。

編輯:

我很抱歉聽到這些。

在這種情況下,我發現有用的這兩篇文章:

+2

這是一個很好的觀點,但不幸的是,這不是我做出的決定。 – 2011-01-07 17:59:01

0

使用PySide這是Python的Qt 4.8的結合,我看到的是單次點擊交付QEvent.MouseButtonPress事件和雙擊會傳遞一個QEvent.MouseButtonPress事件緊隨其後的是QEvent.MouseButtonDblClick。 Windows上的延遲大約爲100ms。這意味着如果您需要區分單擊和雙擊,您仍然有問題。

該解決方案需要另一個QTimer延遲比內置延遲略高(增加一些開銷)。如果您觀察到QEvent.MouseButtonPress事件,則您啓動自己的計時器,萬一發生超時,則爲單擊。在QEvent.MouseButtonDblClick的情況下,這是一個雙擊,你停止計時器,以避免單擊計數。