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

时间:2010-09-24 14:49:11

标签: qt qt4 symbian nokia n97

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

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

    事件类型设置为KeyRelease时,将调用
  1. 事件(QEvent *事件)。

  2. 调用keyReleaseEvent(QKeyEvent * event)。

  3. 并且从未调用过keyPressEvent !!

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

      事件类型设置为KeyPress时,将调用
    1. 事件(QEvent *事件)。

    2. 调用keyPressEvent(QKeyEvent * event)。

    3. 事件类型设置为KeyRelease时,将调用
    4. 事件(QEvent *事件)。

    5. 调用keyReleaseEvent(QKeyEvent * event)。

    6. 这是正确的。

      如何重现:

      #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()但没有成功。

1 个答案:

答案 0 :(得分: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会丢弃该事件。