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 では、ウィンドウ サーバーがキー イベントを FEP (フロント エンド プロセッサ) に送信し、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 機能は、チェーン オブ レスポンシビリティとして実装されます。つまり、チェーン内のコントロールがキー イベントを処理できる場合、そのキー イベントは消費され、チェーン内の後続のコントロールはそれを認識しません。

そのため、入力機能が設定されていないためにイベントが FEP によって破棄されるか (Qt を介してそれらを設定する方法はわかりません)、イベントがチェーンの早い段階で消費されます。

于 2010-09-28T07:53:24.133 に答える