0

私は Qt アプリケーションを作成しており、キープレスをより深いレベルでインターセプトしたいと考えています。これを行うために、QWidget::macEvent()関数をオーバーライドして、EventRef パラメーターをインターセプトしました。

さまざまなイベント (つまり、キーボード イベント、マウス イベント、ウィンドウ イベント) の場合、EventRef は次の値と等しくなります。

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

イベントがキーボード イベントかどうかはどうすればわかりますか? また、どのキーが押されたかを知るにはどうすればよいですか? イベント処理のドキュメントを見てきましたが、それらのほとんどは EventRef について言及していません。一部の記事では、EventRef が Cocoa NSEvent イベントから派生した Carbon イベントであることに言及しています。

4

2 に答える 2

1

いくつかの推測作業の後、本からこの章を見て、Qtアプリケーションのキー押下のEventRefオブジェクトを解釈することに成功しました。

MyProject.proCarbon :フレームワークを含める:

macx {
    LIBS += -framework Carbon
}

MyWidget.hQWidget :: 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
于 2013-02-02T18:41:26.950 に答える
1

1 つの方法は、イベントを表すオブジェクト+[NSEvent eventWithEventRef:]を取得するために使用することです。NSEventを取得したらNSEvent、そのメソッドを使用してイベントを解釈できます。たとえば-[NSEvent type]、それがキーボード イベントかどうかを示し、-[NSEvent characters]/-[NSEvent keyCode]はどのキーが押されたかについての情報を提供します。

于 2013-02-02T09:08:11.433 に答える