首页 文章

输入法是否阻止QLineEdit接收KeyPressEvent?

提问于
浏览
1

我把这个bug发送给Qt团队:http://bugreports.qt-project.org/browse/QTBUG-13726,这里是描述:

QLineEdit / QTextEdit在N97上没有收到keyPressEvent我有一个继承自QLinedEdit的自定义小部件,在这个小部件中我覆盖了事件(QEvent * event),keyPressEvent(QKeyEvent * event)和keyReleaseEvent(QKeyEvent * event) . 当我在N97设备上调试代码时,当我按下键盘上的任意键时,事件按如下方式传送:

调用事件类型设置为KeyRelease的

  • 事件(QEvent *事件) .

调用

  • keyReleaseEvent(QKeyEvent * event) .

和keyPressEvent从未被调用!!

如果按Enter键,BackSpace,操作键,向左,向右,向下,向上,事件按如下方式传递:

调用事件类型设置为KeyPress的

  • 事件(QEvent *事件) .

调用

  • keyPressEvent(QKeyEvent * event) .

调用事件类型设置为KeyRelease的

  • 事件(QEvent *事件) .

调用

  • keyReleaseEvent(QKeyEvent * event) .

哪个是对的 .

How to reproduce:

#include <QKeyEvent>
#include <QMessageBox>
#include <QLineEdit>
#include <QTextEdit>
#include <QDebug>


class MyWidget : public QLineEdit { Q_OBJECT public: MyWidget(QWidget *parent=0); void keyPressEvent(QKeyEvent * event); void keyReleaseEvent(QKeyEvent * event ); bool event(QEvent *event); };

MyWidget::MyWidget(QWidget *parent)
:QLineEdit(parent)

{ setText("Hola"); }
void MyWidget::keyPressEvent(QKeyEvent *event) { QLineEdit::keyPressEvent(event); }

void MyWidget::keyReleaseEvent(QKeyEvent *event ) { QLineEdit::keyReleaseEvent(event); }

bool MyWidget::event(QEvent *event ) {
switch( event->type() ) { case QEvent::KeyPress: QLineEdit::event(event); break; case QEvent::KeyRelease: QLineEdit::event(event); break; default: QLineEdit::event(event); }

}

The same problem appears if I inherits from the QTextEdit

我有这个重播:

Isn't that just because of the input methods?

任何人都可以通过“输入法”向我解释他的意思,以及它与收到的事件有什么关系,我尝试使用setInputMethodHints()和inputMethodEvent()但没有成功 .

1 回答

  • 1

    在Symbian上,Window服务器将关键事件发送到FEP(前端处理器),后者又要求控件输入其功能(请参阅http://developer.symbian.org/main/documentation/reference/s3/pdk/GUID-FCEDC338-61CA-5D10-A8DB-E44A3EBBDE5E-GENID-1-10-1-3-1-1-9-1-3-1.html和TCoeInputCapabilities) . 我认为这是对bug报告的评论所提到的 .

    Symbian中的OfferKeyEventL功能实现为责任链,这意味着如果链中的控件可以处理键事件,则它将被消耗,链中的后续控件将无法识别它 .

    因此,由于未设置输入功能(尽管我不知道如何通过Qt设置它们)或者事件在链中较早消耗,因此FEP会丢弃该事件 .

相关问题