1

http://qt-project.org/doc/qt-5/qwidget.html#keyPressEvent

QKeyEvent は isAccepted() == true で始まることに注意してください。そのため、QKeyEvent::accept() を呼び出す必要はありません。キーを操作する場合は基本クラスの実装を呼び出さないでください。

http://qt-project.org/doc/qt-5/qkeyevent.html#details

キー イベントには、レシーバーがキー イベントを処理するかどうかを示す特別な受け入れフラグが含まれています。キーの押下またはリリース イベントがウィジェットで処理されない場合は、ignore() を呼び出す必要があります。キー イベントは、ウィジェットが accept() でそれを受け入れるか、イベント フィルターがそれを消費するまで、親ウィジェット チェーンに伝搬されます。マルチメディア キーのキー イベントは、デフォルトでは無視されます。ウィジェットがこれらのイベントを処理する場合は、accept() を呼び出す必要があります。

それは少し混乱します。受け入れるかどうかを呼び出す必要がありますか? 処理しない場合は、基本実装を呼び出すか、無視を呼び出す必要がありますか?

最初のページでは、accept() を呼び出す必要はありませ

基本バージョンを呼び出すと、QWidget の場合は基本的に ignore() が呼び出されます。それは私のkeyPressedEventに戻り、無視された状態で戻り、QWidgetのバージョンが再び呼び出されて「キーイベントが親ウィジェットに伝播される」ことを意味しませんか?

4

1 に答える 1

3

おっしゃるとおり、自動的に受け入れられます。したがって、それを処理している場合は、何もする必要はありません。キー イベントを処理していない場合にのみ、 を呼び出す必要がありますignore()

クラスが のサブクラスでありQWidget、キー イベントを処理している場合は、基本実装を呼び出さないでください。それを処理しない場合は、基本実装を呼び出すだけで を呼び出すことができますignore()

イベントの受け入れと無視について詳しく知りたい場合は、これを読むことができます。

  • 最初のページでは、accept() を呼び出す必要はありません。

これは、無視することを選択した場合、 に伝播されることを意味しますparent widget受け入れることを選択した場合、 には伝播されませんparent widget

  • 基本バージョンを呼び出すと、QWidget の場合は基本的に ignore() が呼び出されます。それは私のkeyPressedEventに戻り、無視された状態で戻り、QWidgetのバージョンが再び呼び出されて「キーイベントが親ウィジェットに伝播される」ことを意味しませんか?

基本クラスは、親ウィジェットと同じではありません。基本クラスは、クラスの派生元のクラスです。親ウィジェットは、オブジェクトをthis子ウィジェットとして含むオブジェクトです。これは通常、コンストラクターに引数として渡されるウィジェットです。しかし、親ウィジェットがQWidgetタイプの場合は、そうです。

于 2014-02-21T13:52:53.693 に答える