2017-04-23 8 views
1

QMLでは、1つのオブジェクトだけがキーボードフォーカス(ウィンドウごと)を持つことができます。私のアプリケーションでは、キーボードフォーカスのある複数のオブジェクトを持つオプションが必要なので、カスタムの複数選択実装と組み合わせてカスタムイベントディスパッチャーを使用します。コントロールがキーボードフォーカスを奪うのを防ぐ

ただし、在庫コントロール要素のいずれかをクリックするたびに自動的にフォーカスが奪われ、カスタムイベントディスパッチャーが壊れるという問題があります。

さらに、オーバーレイポップアップなどの場合は、別のフォーカス項目を明示的に設定する必要があります。

答えて

0

私は、このインタフェースになってしまったすべてのフォーカス可能なアイテムに適用:

Item { 
    onFocusChanged: if (keepFocus) focus = true 
    property bool keepFocus: false 
    property Item prevFocus: null 
    function getFocus() { 
    if (prevFocus) { 
     prevFocus.keepFocus = false 
     keepFocus = true 
     focus = true 
    } 
    } 
    function restoreFocus() { 
    if (prevFocus) { 
     keepFocus = false 
     prevFocus.keepFocus = true 
     prevFocus.focus = true 
    } 
    } 
} 

のみオーバーレイダイアログがイベントディスパッチャからフォーカスを取ることになっているので、ダイアログベースの種類を自動的に取得し、復元を扱いますダイアログの表示と非表示にそれぞれ重点を置いています。

「1つのアイテムにフォーカスがある可能性があります」から、「1つのアイテムが明示的にフォーカスを持っている可能性があります」に移動し、コントロール要素がそのアイテムを盗む可能性があるときはいつでも、

1

私はあなたのカスタムイベントのものにどのように収まるのかよく分かりませんが、この答えはあなたの質問を見つけただけで、コントロールがフォーカスを得られないようにするために役立つかもしれません。

あなたはfocusPolicy enumでフォーカスを得ることからコントロールを防ぐことができます。

Button { 
    focusPolicy: Qt.NoFocus 
    // Other options: 
    // focusPolicy: Qt.TabFocus - The control accepts focus by tabbing. 
    // focusPolicy: Qt.ClickFocus - The control accepts focus by clicking. 
    // focusPolicy: Qt.StrongFocus - The control accepts focus by both tabbing and clicking. 
    // focusPolicy: Qt.WheelFocus - The control accepts focus by tabbing, clicking, and using the mouse wheel. 
} 
+0

また、これはトリックを行うことができますが、それはすべての制御要素に手動で追加することの不便を追加します。グローバルなデフォルト設定を無効にすることができる場合を除き、あまり好ましくないオプションにします。それをできる? – dtech

+0

ああ、そうだね、私が気づいていない。私はそのような機能を追加するのは問題外だとは思わない。私が正しく覚えていれば、ある時点でホバーサポートのための同様の環境変数がありました。 – Mitch

関連する問題