Qt键盘按下事件Enter

10
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)。
这是我的驱动程序有问题还是程序本身的错误?
3个回答

16

Qt::Key_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);

10

16777220(十进制)= 1000004(十六进制),因此根据此列表,按下的键是“Return”。看看维基百科 - Enter键在数字键盘上,您使用的键在Qt中称为“Return键”。


但是,我认为16777220是十进制数,1000004是十六进制数;) - Anudorannador

1
这只是回车(CR)和换行(LF)的问题。在C和C++中,CR编码为13(十六进制中的0D),表示为'\r';LF编码为10(十六进制中的0A),表示为'\n'。 Qt :: Key_Enter 代表CR,而Qt :: Key_Return 代表LF。当您按下键盘上的Enter键时,程序实际上可能会接收到LF,而不是CR。您可以通过getchar()函数进行测试-您按下Enter键,但它返回10。因此,您应该读取Qt :: Key_Return 事件,而不是Qt :: Key_Enter 事件。
如果您真的非常关心原因,请查看打字机的历史,因为CR和LF代表打字机中的两个不同操作

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接