void LoginModle::keyPressEvent(QKeyEvent *event)
{
qDebug() << event->key() << "t" << Qt::Key_Enter << "t" << QKeyEvent::Enter;
if( event->key() == Qt::Key_Enter)
OKButtonClicked();
else
QDialog::keyPressEvent(event);
}
这段代码非常简单,类LoginModle
继承自QWidget
。 运行此代码,当我按 Enter 时,它显示:
16777220 16777221 10
这意味着我在键盘中的 Enter 是 16777220
,但在 Qt 中,它被定义为 16777221
。
我的系统是Elementary OS(Freya(,它基于Ubuntu 14.04。
我的驱动程序有问题还是程序的错误?
Qt::Key_Enter
引用的 Enter 键是数字小键盘上的 Enter 键。您正在按键盘上字母旁边的"Enter"键。这称为 Return 键,其值由 Qt::Key_Return
表示,等于 16777220。
因此,为了支持两次按键,您可以按如下方式修改 if 语句:
if( (event->key() == Qt::Key_Enter) || (event->key() == Qt::Key_Return))
OKButtonClicked();
else
QDialog::keyPressEvent(event);
16777220(dec( = 1000004(hex(,所以根据这个列表,按下的键是"返回"。查看 Wiki - Enter 键在数字键盘中,您使用的键在 Qt 中称为"返回键"。
carriage return
(CR(和line feed
(LF(的问题。CR 编码为 13(十六进制为 0D(,在 C 和 C++ 中用"\r"表示;LF 编码为 10(十六进制为 0A(,在 C 和 C++ 中用""表示。 Qt::Key_Enter
代表CR,而Qt::Key_Return
代表LF。当您按下键盘上的Enter
键时,程序实际上可能会接收LF,而不是CR。您可以通过 getchar()
函数进行测试 - 按 Enter
键,但它返回 10。因此,您应该读取Qt::Key_Return
事件,而不是Qt::Key_Enter
事件。
如果您真的非常关心原因,请检查打字机的历史,因为 CR 和 LF 代表打字机中的两种不同操作。