2 votes

Obtenir le statut focus/activeFocus à partir de QML ListView

J'ai une présentation en deux colonnes avec un ListView dans la colonne de gauche. Avec les touches gauche/droite, je peux changer le focus entre les deux parties de l'application.

En une focalisation active de la colonne de gauche est déléguée à la ListView et, de là, directement à l'une de ses lignes.

Comment puis-je vérifier si la ListView ou l'un de ses enfants a le focus ?

import QtQuick 1.1

FocusScope {
    width: 960
    height: 540
    id: app
    focus: true

    FocusScope {
        id: leftColumn
        KeyNavigation.right: rightColumn
        anchors.bottom: parent.bottom
        anchors.left: parent.left
        anchors.top: parent.top
        width: 250
        focus: true

        Rectangle {
            id: leftBackgroundColor
            anchors.fill: parent
            color: contactsList.activeFocus ? "red" : "#E6E6E6"

            ListView {
                id: contactsList
                interactive: true
                anchors.fill: parent
                focus: true

                delegate: Text {
                    text: name
                    font.bold: activeFocus
                }
                model: ListModel {
                    ListElement { name: "Simon" }
                    ListElement { name: "Mary" }
                    ListElement { name: "Jack" }
                    ListElement { name: "Frank" }
                }

            }
        }
     }

    FocusScope {
        id: rightColumn
        KeyNavigation.left: leftColumn

        anchors.left: leftColumn.right
        anchors.right: parent.right
        anchors.bottom: parent.bottom
        anchors.top: parent.top
        onFocusChanged: console.log("Right focus changed: " + focus + "/" + activeFocus)

        Rectangle {
            id: rightBackgroundColor
            anchors.fill: parent
            focus: true
            color: activeFocus ? "red" : "#b3b3b3"            
        }
    }
}

3voto

Simon Warta Points 4331

Je pense avoir trouvé une solution :

onActiveFocusChanged: { focusChanged(focus) }

Il émet le focusChanged chaque fois que la focalisation active change. Grâce à cela, les liaisons de propriétés (comme couleur : parent.focus ? "red" : "#E6E6E6" ) fonctionnent également.

Code de test complet :

import QtQuick 1.1

FocusScope {
    width: 960
    height: 540
    id: app
    focus: true

    FocusScope {
        id: leftColumn
        KeyNavigation.right: rightColumn
        anchors.bottom: parent.bottom
        anchors.left: parent.left
        anchors.top: parent.top
        width: 250

        onActiveFocusChanged: { focusChanged(focus) }

        Rectangle {
            id: leftBackgroundColor
            anchors.fill: parent
            color: parent.focus ? "red" : "#E6E6E6"

            ListView {
                id: contactsList
                interactive: true
                anchors.fill: parent
                focus: true

                delegate: Text {
                    text: name
                    font.bold: activeFocus
                }
                model: ListModel {
                    ListElement { name: "Simon" }
                    ListElement { name: "Mary" }
                    ListElement { name: "Jack" }
                    ListElement { name: "Frank" }
                }

            }
        }
     }

    FocusScope {
        id: rightColumn
        focus: true
        KeyNavigation.left: leftColumn

        anchors.left: leftColumn.right
        anchors.right: parent.right
        anchors.bottom: parent.bottom
        anchors.top: parent.top

        onActiveFocusChanged: { focusChanged(focus) }

        Rectangle {
            id: rightBackgroundColor
            anchors.fill: parent
            focus: true
            color: activeFocus ? "red" : "#b3b3b3"            
        }
    }
}

2voto

Robin Burchell Points 723

Je sais qu'il s'agit d'une vieille question, mais je pense qu'elle mérite toujours une explication appropriée, car le même modèle de focalisation est toujours utilisé dans QtQuick 2.

Comment puis-je vérifier si la ListView ou l'un de ses enfants a le focus ?

Le problème central ici est que vous semblez être un peu confus quant à la signification des deux propriétés de focalisation (et c'est compréhensible, c'est un peu moins évident).

Pour savoir si un FocusScope (ou l'un de ses enfants) a le focus en ce moment, vous devez vérifier l'attribut Item::activeFocus sur elle. Cela signifie que "soit moi, soit l'un de mes enfants a le focus en ce moment", et il est récursivement effacé d'un FocusScope lorsque le focus est déplacé vers un autre FocusScope.

D'autre part, Item::focus est un demande pour le focus, et non des informations sur l'état actuel, et vous ne devez donc pas y associer d'autres valeurs (par ex. color: foo.focus ? "black" : "red" ), à moins que vous ne souhaitiez vérifier si l'élément est capable ou non d'utiliser la fonction se concentrer sur l'essentiel à un moment donné dans l'avenir, et non pas s'il a se concentrer dès maintenant.

Cela explique que l'on puisse avoir quelque chose avec Item::focus vrai, bien qu'il n'y ait pas de focus -- ce n'est pas que le signal est manquant, c'est que vous avez abusé de la propriété pour signifier quelque chose qu'elle n'est pas.

Vous voulez donc quelque chose comme ça :

Rectangle {
        id: leftBackgroundColor
        anchors.fill: parent
        color: leftColumn.activeFocus ? "red" : "#E6E6E6"
}

...

Rectangle {
    id: rightBackgroundColor
    anchors.fill: parent
    focus: true
    color: rightColumn.activeFocus ? "red" : "#b3b3b3"
}

0voto

Deadron Points 2781

Vous vous créez des problèmes avec ce code. Un seul élément peut avoir le focus à un moment donné, donc si la propriété focus de chaque élément est fixée à true, il n'est pas évident de savoir quel élément a le focus lorsqu'il est rendu (je crois que c'est le dernier élément rendu qui a le focus fixé). Pour savoir quel est l'élément qui a le focus, vous ne pouvez pas demander l'élément qui a le focus. Ce que vous pouvez faire, c'est connecter un écouteur à l'événement onFocusChanged qui existe sur les éléments pour effectuer des actions lorsque cet objet gagne/perd le focus. Une meilleure question pourrait être : pourquoi se soucier de savoir qui a le focus ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X