我正在使用Qt 4.3.1(我无法在此刻上传)程序,无论如何在Windows的死钥匙(^,',`,。 ..)不会到达keyPressedEvent(),我总是必须按两次。死锁没有到达keyPressedEvent()
那么,为什么这些死钥匙没有到达?我该如何解决它?
在MacOS中,一切工作正常。
Thx,eL。
我正在使用Qt 4.3.1(我无法在此刻上传)程序,无论如何在Windows的死钥匙(^,',`,。 ..)不会到达keyPressedEvent(),我总是必须按两次。死锁没有到达keyPressedEvent()
那么,为什么这些死钥匙没有到达?我该如何解决它?
在MacOS中,一切工作正常。
Thx,eL。
看过Qt文档后,我不确定keyPressEvent是否应该传递死锁。我真的很惊讶你在Mac上看到他们。
我猜Qt正在选择等待WM_CHAR事件或其他事情,然后发送keyPressEvent为您的小部件。正如你可以从这个页面中看到:http://msdn.microsoft.com/en-us/library/ms646267(VS.85).aspx#_win32_Dead_Character_Messages关键事件的顺序,当用户按下一个死键,然后按一个真正的钥匙是:
WM_KEYDOWN
WM_DEADCHAR
WM_KEYUP
WM_KEYDOWN
WM_CHAR
WM_KEYUP
如果你真的想捕捉的deadchar键按压,看看在继承QApplication并覆盖winEventFilter(http://doc.qt.io/qt-4.8/qcoreapplication.html#winEventFilter)方法。这会让你在进入时捕获WM_DEADCHAR事件。然后,你可以创建一个KeyEvent并将其分派给当前拥有焦点的小部件。
Qt等待WM_CHAR事件的猜测是错误的。在处理WM_KEYDOWN事件时,Qt在消息队列中查找WM_DEADCHAR消息。如果有这样的消息,Qt绕过正常的WM_KEYDOWN处理。如果你想接收QKeyEvent的死键,你应该从WM_DEADCHAR消息中清理消息队列。写一点这样的代码:
bool TEventFilter::nativeEventFilter(const QByteArray &eventType, void *message, long *result)
{
if(eventType=="windows_generic_MSG")
{
MSG *msg=static_cast<MSG*>(message);
MSG peekedMsg;
switch(msg->message)
{
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
PeekMessage(&peekedMsg, msg->hwnd, WM_DEADCHAR, WM_DEADCHAR, PM_REMOVE);
case WM_CHAR:
case WM_DEADCHAR:
if(msg->lParam&0x40000000) //message is repeated via the key holding down
return 1;
}
}
return 0;
}
你的问题是什么? – WolfgangA 2010-10-06 11:51:30
增加了更多明确的问题。 – 2010-10-06 11:58:45