2017-05-17 1 views
1

-je utiliser un ListView et à l'intérieur de chaque Item de cette ListView, j'ai un ComboBox ou un SpinBox.Comment prévenir le changement de mise au point lorsque la souris passe ou ComboBox SpinBox article

Mon problème est que quand je veux scroll mon ListView, si mon mouse va sur un ComboBox ou un SpinBox, le focus va changer etle scroll va maintenant être sur cette Item au lieu de la liste.

Je voudrais que le focus ne soit défini sur ces éléments que si je les clique.

exemple de code:

import QtQuick.Controls 1.4 

ListView { 
    id: list 
    ScrollBar.vertical: ScrollBar {} 
    ... 
    model: DelegateModel { 
     id:delegate 
     model: myModel 
     delegate : Rectangle { 
      id: rect 
      ... 
      SpinBox { 
       id: spin 
       ... 
      } 
     }  
    } 
} 

Comment pourrais-je procéder?

+0

Votre 'SpinBox' est de QtQuick.Controls 1.x ou 2.x? – derM

+0

J'utilise 'importer QtQuick.Controls 1.4' –

Répondre

1

Ceci est un problème commun avec les anciens composants QtQuick.Controls 1.x, qu'ils attrapent avidement les événements de la souris. À ma connaissance, il n'existe aucun moyen officiel d'empêcher cela.

Here vous trouverez une solution, sur la façon de superposer un tel composant (dans ce cas, un Slider) avec un MouseArea qui empêche cette mauvaise conduite.

Vous pouvez également utiliser la nouvelle boîte à lettres QtQuick.Controls 2.x. Comme cela a un look par défaut différent, vous devrez peut-être l'ajuster, pour ressembler (plus) à l'ancien. Here vous pouvez trouver une description sur la façon dont vous pouvez le faire. Rappelez-vous qu'il est facile d'avoir à la fois: QtQuick.Controls 1.x et QtQuick.Controls 2.x dans un fichier, en les important avec des alias.

Creuser dans la source du QtQuick.Controls 1.4, nous pouvons également trouver une solution hacky.

Fichiers pertinents:

On peut voir, un SpinBox est un Control. Le SpinBox a un enfant MouseArea, qui gère le onWheel -event. Nous allons désactiver ce MouseArea. Pour y accéder, nous avons besoin de connaître l'index dans le SpinBox.children. Nous voyons dans Control qu'il y a deux Loader comme enfants (Index 0 et 1). En SpinBox nous avons deux autres enfants avant les MouseArea (Index 2 et 3) -> Nous devons donc régler idOfSpinBox.children[4].enabled = false pour désactiver la sensibilité des roues.

import QtQuick 2.7 
import QtQuick.Controls 1.4 

ApplicationWindow { 
    id: root 
    visible: true 
    width: 800 
    height: 600 

    ListView { 
     model: 20 
     width: 100 
     height: 200 
     delegate: SpinBox { 
      Component.onCompleted: children[4].enabled = false 
     } 
    } 
} 

ou si nous voulons avoir la molette de défilement activé, lorsque le SpinBox a été cliquée, nous utilisons:

delegate: SpinBox { 
    id: spinBox 
    Component.onCompleted: children[4].enabled = Qt.binding(function() { return spinBox.activeFocus }) 
} 

Mais nous avons besoin de trouver un moyen de perdre cette mise au point.

+0

Merci pour votre réponse complète. J'ai essayé les deux exemples et ils fonctionnent bien. Cependant, à ce stade, je dois utiliser 'QtQuick.Controls 1.x' car la partie' QML' fera partie d'une application 'classique '' QWidget' et j'ai besoin que certains composants aient un aspect "classique". Cela pourrait changer dans le futur. –

+0

Ajouté d'une autre manière, en inspectant la source de la 'SpinBox' - j'espère que cela aide. – derM

+0

Bonjour, merci de creuser dans les sources, cela fonctionne pour SpinBox et c'est une excellente solution. Cependant, j'ai essayé d'appliquer cette solution pour 'ComboBox' mais si vous désactivez' MouseArea' ('children [2]'), vous désactiverez également 'onClicked' pour que le ComboBox ne fonctionne plus –