相对鼠标消息, 键盘消息显得要容易些.
主要是继承并实现这两个函数
virtual void keyReleaseEvent(QKeyEvent * event); virtual void keyPressEvent(QKeyEvent * event);
我在这两个函数里加了些代码,让用户的按键状态在状态栏中显示出来
void MainWindow::keyPressEvent(QKeyEvent * event) { QString strMessage = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"); strMessage += " keyPressEvent "; if (event->modifiers() & Qt::ControlModifier) { strMessage += " ctrl"; } if (event->modifiers() & Qt::ShiftModifier) { strMessage += " shift"; } if (event->modifiers() & Qt::AltModifier) { strMessage += " alt"; } qDebug() << hex << event->key() << endl; if ( (0 == event->key()) || ( Qt::Key_unknown == event->key()) || event->key() > Qt::Key_Escape) { strMessage += " no_key"; }else { strMessage += " key="; strMessage += QChar(event->key()); } ui->statusBar->showMessage(strMessage); } void MainWindow::keyReleaseEvent(QKeyEvent * event) { QString strMessage = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"); strMessage += " keyReleaseEvent "; if (event->modifiers() & Qt::ControlModifier) { strMessage += " ctrl"; } if (event->modifiers() & Qt::ShiftModifier) { strMessage += " shift"; } if (event->modifiers() & Qt::AltModifier) { strMessage += " alt"; } qDebug() << hex << event->key() << endl; if ( (0 == event->key()) || ( Qt::Key_unknown == event->key()) || event->key() > Qt::Key_Escape ) { strMessage += " no_key"; }else { strMessage += " key="; strMessage += QChar(event->key()); } ui->statusBar->showMessage(strMessage); }
值得注意的是,假如我只按一个CTRL键,event->key()的值是1000021
按我的理解,event->key()应该是是0或者Qt::Key_unknown,表示没有键按下参考QT文档
int QKeyEvent::key() const
最终,我觉得,如果event->key()的值大于0x1000000,就认为没有实际的键按下:
if ( (0 == event->key()) || ( Qt::Key_unknown == event->key()) || event->key() > Qt::Key_Escape) { strMessage += " no_key"; }else { strMessage += " key="; strMessage += QChar(event->key()); }
Key_Escape的值定义如下:
Key_Escape = 0x01000000, // misc keys
代码见: http://q1024.com/files/qt_window-master.zip 000700目录