1

我将此错误发送给 Qt 团队: http ://bugreports.qt-project.org/browse/QTBUG-13726 ,这是描述:

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

  1. event(QEvent * events) 被调用,事件类型设置为 KeyRelease。

  2. keyReleaseEvent(QKeyEvent *event) 被调用。

并且从未调用过 keyPressEvent !

如果我按 Enter、BackSpace、操作键、左、右、下、上,则事件传递如下:

  1. event(QEvent * events) 被调用,事件类型设置为 KeyPress。

  2. keyPressEvent(QKeyEvent *event) 被调用。

  3. event(QEvent * events) 被调用,事件类型设置为 KeyRelease。

  4. keyReleaseEvent(QKeyEvent *event) 被调用。

哪个是对的。

如何重现:

#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); }

}

如果我从 QTextEdit 继承,也会出现同样的问题

我有这个重播:

不就是因为输入法吗?

谁能向我解释他所说的“输入法”是什么意思,以及它与接收到的事件的关系,我尝试使用 setInputMethodHints() 和 inputMethodEvent() 没有成功。

4

1 回答 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)。我认为这就是对错误报告的评论所指的内容。

Symbian 中的 OfferKeyEventL 功能被实现为责任链,这意味着如果链中的控件可以处理关键事件,则它会被消耗,并且链中的后续控件将不会意识到它。

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

于 2010-09-28T07:53:24.133 回答