2017-02-17 18 views
2

qmlファイルの読み込み時にTextFieldフォーカスを有効にしたいとします。しかし、それは動作していません。 TestUi.qmlファイルを読み込んだ後、ボタンとそのonClickメソッドを入れました。recipientView.focus = true、うまくいきます。問題は、最初にビューを読み込んだときにデフォルトフォーカスが有効にならないことです。Qt QML StackViewページを表示しているときにアイテム(TextField)にフォーカスを設定します。

TestUi.qml

import QtQuick 2.0 
import QtQuick.Controls 2.1 
import QtQuick.Layouts 1.0 


Page { 

    function init() { 
     recipientView.focus = true; 
    } 

    TextField { 
     id: recipientView 
     Layout.fillWidth: true 
     font.pixelSize: 18 
     inputMethodHints: Qt.ImhNoPredictiveText | Qt.ImhEmailCharactersOnly 
     focus: true 
     placeholderText: "Email" 

    } 
} 

main.qml

onComposeBtnClicked: { 
    rootStackView.push(test) 
    test.init() 
} 

TestUi { 
    id: test 
    visible: false 
} 
+0

'Component.onCompleted:recipientView.focus = true; 'で設定しようとしましたか? – DuKes0mE

+0

アプリケーションの読み込みが開始されると、Component.onCompletedはどのページであっても動作しています。私はそれを助けてくれませんでした – nAkhmedov

答えて

3

あなたがrootStackView.push(test)とあなたのスタックにTestUiを推進しているので、これは単純です。これを行うと、フォーカスがリセットされます。これは、通常で処理されます。この役割は、フォーカスされたItemを覚えておき、QFocusScopeがフォーカスを取り戻したときにフォーカスを戻すことです。あなたのケースでは

、ページが表示されたときに、あなたのベースページへQFocusScopeを追加すると、フォーカスを正しく復元できるようになる:

StackView { 
    id: stackView 
    initialItem: firstPage 
    onCurrentItemChanged: { 
     currentItem.forceActiveFocus() 
    } 
} 

Page { 
    id: firstPage 
    onFocusChanged: { 
     scope.focus = true 
    } 
    FocusScope { 
     id: scope 
     TextField { 
      focus: true 
      // ... 
     } 
    } 
} 

あなたは時に集中することをリセットしたい場合は、あなたのページハンドラonVisibleChangedを使用することができますフォーカスがある場所を暗記するのではなく、ユーザーがポップの後に戻ってきます。しかし、その場合、FocusScopeは過度の攻撃になるかもしれません。

詳細については、StackViewプロパティinitialItemを使用して、最初のページを設定することもできます。

+0

ありがとう、男!それはうまく動作します – nAkhmedov

+0

私はメインページにフォーカスを設定する必要があります。私にとっては、ちょうど onCurrentItemChangedを追加しました:{ currentItem.forceActiveFocus() } to main.qml。ターゲットファイルにFocus.scopeを追加すると、エラーが発生しました。 – KOHTPOJIEP

関連する問題