2013-02-02 20 views
0

我正在製作一個Qt應用程序,並希望在更深層次攔截按鍵。爲此,我重寫了QWidget::macEvent()函數以攔截EventRef參數。Qt - 從QWidget :: macEvent()的EventRef paraneter獲取鍵盤鍵碼?

對於不同的事件(即鍵盤事件,鼠標事件,窗口事件)EventRef等於以下值:

0×104d649f0 
0×101425740 
0×104d649f0 
0×101485950 
0×101425740 
0×101485950 

我怎麼能告訴我們,如果事件是一個鍵盤事件?我怎麼知道哪個鍵被按下了?我查看了事件處理文檔,其中大部分都沒有提到EventRef。一些文章提到EventRef是如何從Cocoa NSEvent事件派生的Carbon事件。

回答

1

經過一番猜測的工作,看着this chapter from a book,我已經成功地在Qt應用程序解釋EventRef對象按鍵:

MyProject.pro:包括Carbon框架:

macx { 
    LIBS += -framework Carbon 
} 

MyWidget.h:覆蓋QWidget::macEvent()

class MyWidget : public QWidget { 

    ... 

    private: 
     #if defined(Q_OS_MAC) 
      bool macEvent(EventHandlerCallRef, EventRef event); 
     #endif 
}; 

MyWidget.cpp

#if defined(Q_OS_MAC) 
    #include <Carbon/Carbon.h> 
#endif 

... 

#if defined(Q_OS_MAC) 
    bool MyWidget::macEvent(EventHandlerCallRef, EventRef event) { 
     uint32_t keyCode; 

     switch (GetEventClass(event)) { 
      case kEventClassApplication: 
       qDebug() << "kEventClassApplication"; 
       break; 
      case kEventClassCommand: 
       qDebug() << "kEventClassCommand"; 
       break; 
      case kEventClassControl: 
       qDebug() << "kEventClassControl"; 
       break; 
      case kEventClassKeyboard: 
       qDebug() << "kEventClassKeyboard"; 

       switch(GetEventKind(event)) { 
        case kEventRawKeyDown: 
         qDebug() << "kEventRawKeyDown"; 

         GetEventParameter(event, kEventParamKeyCode, typeUInt32, NULL, sizeof(keyCode), NULL, &keyCode); 
         qDebug() << "keyCode =" << keyCode; 

         break; 
        case kEventRawKeyRepeat: 
         qDebug() << "kEventRawKeyRepeat"; 
         break; 
        case kEventRawKeyUp: 
         qDebug() << "kEventRawKeyUp"; 

         GetEventParameter(event, kEventParamKeyCode, typeUInt32, NULL, sizeof(keyCode), NULL, &keyCode); 
         qDebug() << "keyCode =" << keyCode; 

         break; 
        case kEventRawKeyModifiersChanged: 
         qDebug() << "kEventRawKeyModifiersChanged"; 
         break; 
        case kEventHotKeyPressed: 
         qDebug() << "kEventHotKeyPressed"; 
         break; 
        case kEventHotKeyReleased: 
         qDebug() << "kEventHotKeyReleased"; 
         break; 
       } 

       break; 
      case kEventClassMenu: 
       qDebug() << "kEventClassMenu"; 
       break; 
      case kEventClassMouse: 
       qDebug() << "kEventClassMouse"; 
       break; 
      case kEventClassTablet: 
       qDebug() << "kEventClassTablet"; 
       break; 
      case kEventClassTextInput: 
       qDebug() << "kEventClassTextInput"; 
       break; 
      case kEventClassWindow: 
       qDebug() << "kEventClassWindow"; 
       break; 
      default: 
       break; 
     } 

     return true; 
    } 
#endif 
0

一種方法是使用+[NSEvent eventWithEventRef:]來獲取代表事件的NSEvent對象。一旦你有了一個NSEvent,你可以用它的方法來解釋事件,例如-[NSEvent type]會告訴你它是否是鍵盤事件,並且-[NSEvent characters]/-[NSEvent keyCode]會給你關於哪些鍵被按下的信息。