2017-02-17 3 views
2

Je souhaite activer le focus TextField lors du chargement du fichier qml. Mais ça ne fonctionne pas. Après avoir chargé le fichier TestUi.qml j'ai mis un bouton et sa méthode onClick j'ai fait recipientView.focus = true, ça marche bien. Le problème est que le focus par défaut n'est pas activé lorsque la vue est chargée pour la première fois.Qt QML Focus un élément (TextField) lors de l'affichage d'une page StackView

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

Avez-vous essayé de le définir via 'Component.onCompleted: recipientView.focus = true;'? – DuKes0mE

+0

Lorsque l'application commence à se charger, Component.onCompleted est en cours d'exécution quelle que soit la page. Je ne l'ai pas aidé – nAkhmedov

Répondre

3

Ceci est tout simplement parce que vous poussez TestUi dans votre pile avec rootStackView.push(test). Lorsque vous faites cela, la mise au point est réinitialisée. Ceci est généralement géré avec un QFocusScope, dont le rôle est de se souvenir de l'élément ciblé, et de le recentrer lorsque le QFocusScope reprend le focus.

Dans votre cas, l'ajout d'un QFocusScope à votre page de base permettrait la restauration de mise au point correctement lorsque la page est affichée:

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

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

Vous pouvez ensuite utiliser votre gestionnaire de pages onVisibleChanged si vous souhaitez réinitialiser le focus lorsque l'utilisateur y revient (après un pop par exemple), au lieu de le mémoriser là où se trouve le focus. Mais dans ce cas, le FocusScope pourrait être exagéré.

Pour information, vous pouvez également utiliser la propriété StackView initialItem pour définir la première page.

+0

Merci mec! Cela fonctionne bien – nAkhmedov

+0

Je dois mettre au point pas à la page principale. Pour moi travaillé juste en ajoutant onCurrentItemChanged: { currentItem.forceActiveFocus() } Pour le fichier main.qml. Et l'ajout de Focus.scope à mon fichier cible a provoqué une erreur. – KOHTPOJIEP