2014-10-18 56 views
2

在Qt中捕獲應用程序範圍事件時遇到了一些困難。在Qt中捕獲拖動取消事件

我的目的是捕捉某些GUI應用程序中的每個用戶動作。當然,我已經覆蓋QApplication::notify處理程序並處理不同類型的應用程序範圍事件。類似的東西:

bool CoolApplication::notify(QObject *obj, QEvent *e) 
{ 
    switch (e->type()) { 
    case QEvent::MouseButtonPress: 
    case QEvent::MouseButtonRelease: 
     // Handle mouse 
     break; 

    case QEvent::Wheel: 
     // Handle wheel 
     break; 

    case QEvent::KeyPress: 
    case QEvent::KeyRelease: 
     // Handle keyboard and so on 
     break; 
    default: 
     break; 
    } 

    return QApplication::notify(obj, e); 
} 

直到用戶開始拖放操作爲止,這種方式非常有效。鼠標新聞事件處理得很好,它在我的處理程序中捕捉,生活在那裏美麗。當我嘗試在Windows上捕獲鼠標釋放事件時,問題就開始了。

當進入拖動操作時,鼠標和鍵盤事件不再由QApplication :: notify處理。當它成功時可以捕獲丟棄事件(我可以將case QEvent::Drop分支添加到我的處理程序中),但是如何使用Esc捕獲被忽略的丟棄或取消丟棄?似乎不可能直接完成,也許我可以捕獲拖動事件循環終止事件或類似的東西?或者甚至可能有人知道一個直接的方法來做到這一點?

編輯: 再次打開,我需要捕捉應用程序範圍的事件的關注,而不是小部件一個

+0

有DragEnter事件,該事件意味着用戶開始拖動並輸入小部件。也許它有幫助。 – Chernobyl 2014-10-18 20:00:15

+0

@切爾諾貝利,謝謝,我知道拖延事件的存在,但他們不會幫助。我需要拖動終止事件,既不進入也不離開。 – dvvrd 2014-10-18 20:03:47

回答

0

請試試這個

bool QtCoreApplication::notify(QObject *obj, QEvent *e) 
    { 
     switch (e->type()) { 
     case QEvent::QDropEvent: 
      QDropEvent* dropEvent = (QDropEvent*)e; 
      dropEvent->keyboardModifiers(); // keys pressed 
      dropEvent->dropAction(); // Drop result 
     break; 

     return QApplication::notify(obj, e); 
    } 
+0

謝謝你的回答,@ Krionix,但它不是我需要的東西。您的提案適用於具體小部件,但我需要處理應用程序範圍事件。這意味着拖動可以被不同的窗口小部件甚至窗口忽略,我鋼需要知道它被中斷的時刻 – dvvrd 2014-10-19 10:50:13

+0

好吧,現在我明白你的意思了,對於offtop答案抱歉。 這是因爲拖動操作是一個阻塞操作exec()並且主事件循環正在等待拖動完成,這就是爲什麼不處理所有其他事件。你需要在你的通知函數中添加「case QEvent :: Drop」,並且要求你的QDropEvent對於任何修改鍵QDropEvent :: keyboardModifiers()並且丟棄結果。謝謝。 – Krionix 2014-10-19 12:19:04

+0

我也知道,我甚至在問題的底部寫到了。但是,當用戶拖拽到一個不接受它的小部件時,「QEvent :: Drop」不會被通知,換句話說,如果拖動光標時出現了圓圈。該事件只是沒有解僱,你可以嘗試自己:)但是,謝謝你的建議 – dvvrd 2014-10-19 12:25:14