2016-06-29 18 views
1

私はQt GUIアプリケーションを持っています。私は全体の窓の下にあるすべてのキー押下イベントを処理したいと思いますQtQuickキープレスイベントの伝達

QQuickView * view = new QQuickView(); 
QWidget * container = QWidget::createWindowContainer (view, this); 

:メインウィンドウはウィンドウコンテナを使用して、その上に置かれQtQuickコンポーネントが含まれています。しかし、QtQuickコンポーネントがフォーカスを取得したときにキーイベントを処理することができないという問題に直面しました。

documentationは、そのような行動が期待されていると言う:

のQWidget *のQWidget :: createWindowContainer(QWindow *ウィンドウ、QWidgetの*親=> Q_NULLPTR、Qtの:: WindowFlagsフラグ= Qtの:: WindowFlags())
...
ウィンドウコンテナは、既知の多くの制限があります。取り扱い
...
フォーカス。ウィンドウコンテナインスタンスにフォーカスポリシーを持たせることができ、QWindow :: requestActivate()の呼び出しを介してフォーカスをウィンドウに委譲します。ただし、QWindowインスタンスから通常のフォーカスチェーンに戻るのは、QWindowインスタンスの実装自体になります。例えば、タブフォーカスを持つQtクイックベースのウィンドウに入ると、QMLアプリケーション内でタブの追加操作が繰り返される可能性が非常に高いです。また、QWindow :: requestActivate()が実際にウィンドウのフォーカスを与えるかどうかは、プラットフォームによって異なります。

私の質問は:フォーカスがQtQuickコンポーネントによって取得されても、ウィンドウ全体でキープレスイベントを処理する方法はありますか?

GitLabで利用可能な最小限の完全な例。

答えて

0

可能(醜い)一つの解決策は次のとおりです。

  1. QMLでキープレスイベントを処理します。
  2. 信号でQMLのC++コードに通知します。
  3. C++コードでは、キープレスイベントを生成します。
  4. 共通イベントフィルタでネイティブイベントと再生成イベントを処理します。

GitLabで利用可能な例。

関連する問題