8
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

我的系统是基于 Ubuntu 14.04 的 Elementary OS (Freya)。

我的驱动程序有问题还是只是程序的错误?

4

3 回答 3

14

所指Qt::Key_Enter的回车键是数字小键盘上的回车键。您正在按下键盘上字母旁边的“Enter”键。这称为 Return 键,其值由 表示Qt::Key_Return,等于 16777220。

因此,为了支持这两种按键,您将修改 if 语句,如下所示:

if( (event->key() == Qt::Key_Enter) || (event->key() == Qt::Key_Return))
        OKButtonClicked();
    else
        QDialog::keyPressEvent(event);
于 2014-09-03T06:12:38.537 回答
9

16777220(dec) = 1000004(hex),所以根据这个列表,按下的键是“返回”。查看Wiki - Enter 键在数字键盘中,您使用的键在 Qt 中称为“返回键”。

于 2014-09-03T06:09:29.860 回答
1

这只是carriage return(CR)和line feed(LF)的问题。CR 编码为 13(十六进制为 0D),在 C 和 C++ 中用 '\r' 表示;LF 编码为 10(十六进制为 0A),在 C 和 C++ 中用 '\n' 表示。Qt::Key_Enter代表CR,而Qt::Key_Return代表LF。当您按下Enter键盘上的键时,程序实际上可能会收到 LF,而不是 CR。您可以通过getchar()函数进行测试 - 您按下Enter键,但它返回 10。因此,您应该读取Qt::Key_Return事件,而不是Qt::Key_Enter事件。

如果你真的非常关心原因,请查看打字机的历史,因为 CR 和 LF 代表打字机中的两种不同操作。

于 2014-09-03T16:54:56.240 回答