2010-10-06 35 views
2

我正在使用Qt 4.3.1(我无法在此刻上传)程序,无论如何在Windows的死钥匙(^,',`,。 ..)不会到达keyPressedEvent(),我总是必须按两次。死锁没有到达keyPressedEvent()

那么,为什么这些死钥匙没有到达?我该如何解决它?

在MacOS中,一切工作正常。

Thx,eL。

+0

你的问题是什么? – WolfgangA 2010-10-06 11:51:30

+0

增加了更多明确的问题。 – 2010-10-06 11:58:45

回答

2

看过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并将其分派给当前拥有焦点的小部件。

0

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; 
}