我在主应用程序中有一个本机小部件(用于自定义3d渲染)。我想处理原生键盘事件,例如WM_KEYDOWN
,WM_KEYUP
或WM_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 );
}
我在这里收到鼠标事件,但没有传递任何键盘事件。如何在原生级别处理它们?
覆盖keyPressEvent
或keyReleaseEvent
工作正常,但我需要处理原生事件的处理程序。
在Qt4中有一个QWidget::winEvent
方法,它可以正常工作。但在Qt5中,它被替换为QWidget::nativeEvent
- 我遇到了问题。
更新:Bugreport使用最少的样本(基于cmake)