如何处理本机QWidget的键盘事件?

时间:2014-10-22 13:20:12

标签: c++ qt

我在主应用程序中有一个本机小部件(用于自定义3d渲染)。我想处理原生键盘事件,例如WM_KEYDOWNWM_KEYUPWM_CHAR

下一个代码用于创建:

NativeWidget::NativeWidget( QWidget *parent )
    : QWidget(parent)
{
    setWindowFlags( windowFlags() | Qt::FramelessWindowHint );
    // Focus policy is WheelFocus
    setAttribute( Qt::WA_OpaquePaintEvent, true );
    setAttribute( Qt::WA_NoSystemBackground, true );
    setAttribute( Qt::WA_PaintOnScreen, true );
    setAttribute( Qt::WA_TranslucentBackground, true );
    setAttribute( Qt::WA_NativeWindow, true );
}

下一个代码用于处理本机事件:

bool NativeWidget::nativeEvent( const QByteArray& eventType, void* msg, long* result )
{
    MSG *message = static_cast<MSG *>( msg );

    switch ( message->message )
    {
    case WM_LBUTTONDBLCLK:
    case WM_RBUTTONDBLCLK:
    case WM_LBUTTONDOWN:
    // ...Some debug stuff...
    case WM_NCPAINT:
    case WM_MOUSELEAVE:
        break;

    case WM_CHAR:
    case WM_KEYDOWN:
    case WM_KEYUP:
        // OMG! I couldn't get there... :(
        break;

    default:
        qDebug() << message->message;
        break;
    }

    return QWidget::nativeEvent( eventType, message, result );
}

我在这里收到鼠标事件,但没有传递任何键盘事件。如何在原生级别处理它们?

覆盖keyPressEventkeyReleaseEvent工作正常,但我需要处理原生事件的处理程序。

在Qt4中有一个QWidget::winEvent方法,它可以正常工作。但在Qt5中,它被替换为QWidget::nativeEvent - 我遇到了问题。

更新:Bugreport使用最少的样本(基于cmake)

0 个答案:

没有答案