【问题标题】:Qt - Obtaining keyboard keycode from QWidget::macEvent()‘s EventRef paraneter?Qt - 从 QWidget::macEvent() 的 EventRef 参数中获取键盘键码?
【发布时间】:2013-01-17 14:09:55
【问题描述】:

我正在制作一个 Qt 应用程序,并希望在更深层次上拦截按键。为此,我重写了 QWidget::macEvent() 函数以拦截 EventRef 参数。

对于不同的事件(即键盘事件、鼠标事件、窗口事件)EventRef等于以下值:

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

如何判断事件是否为键盘事件?以及如何找出按下了哪个键?我查看了事件处理文档,其中大多数都没有提到 EventRef。有些文章提到 EventRef 是如何从 Cocoa NSEvent 事件派生出来的 Carbon 事件。

【问题讨论】:

    标签: macos qt events input keyboard


    【解决方案1】:

    一种方法是使用+[NSEvent eventWithEventRef:] 来获取代表事件的NSEvent 对象。一旦你有了NSEvent,你就可以使用它的方法来解释事件,例如-[NSEvent type] 会告诉你这是否是键盘事件,-[NSEvent characters] / -[NSEvent keyCode] 会告诉你按下了哪些键。

    【讨论】:

      【解决方案2】:

      经过一番猜测并查看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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-06
        • 1970-01-01
        • 1970-01-01
        • 2020-11-09
        • 2019-06-02
        • 1970-01-01
        • 2020-01-19
        相关资源
        最近更新 更多