IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PyQt Python Discussion :

QTableView : événement sur combo box


Sujet :

PyQt Python

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    788
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 788
    Points : 446
    Points
    446
    Par défaut QTableView : événement sur combo box
    Bonjour à tous
    Je cherche une solution pour avoir une combobox dans un QTableView (jusque là rien de complexe) et j'aimerai adapter le comportement de la combobox en fonction de l’événement reçu (clavier ou souris)
    Par exemple, si c'est un evenement souris, il faudrait valider la valeur sélectionnée alors que si c'est un événement clavier, il faudrait garder un comportement normal
    Je suis un peu perdu dans la réalisation (pour ma défense, je découvre python depuis peu)

    Mon code actuel :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class ComboDelegate(QtGui.QItemDelegate):
     
        def __init__(self, parent):
            super(Delegate,self).__init__(parent)
     
        def createEditor(self,parent,option,index):
            editor = QtGui.QComboBox(parent)
            editor.addItems(self.comboItems())
            def fc(x):
                self.commitData.emit(editor)
                self.closeEditor.emit(editor, QtGui.QAbstractItemDelegate.NoHint)
            editor.activated[int].connect(fc)
            return editor

    cela correspond bien à l'utilisation de la souris mais devient problématique avec une utilisation du clavier
    Je souhaiterai donc savoir quel événement est en jeu pour utiliser ou non la fonction fc
    J'ai pensé créer une classe héritant de QtGui.QComboBox pour surcharger la méthode event mais je suis perdu !
    Merci pour votre aide
    Le savoir est une arme alors soyons armés

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Oui, pour changer le comportement du combobox, il faut créer une nouvelle classe héritant de QCombobox, surcharger les méthodes qui traitent les évènements, puis prendre ce nouveau widget dans le delegate en remplacement du combobox.

    Les méthodes à surcharger existent déjà: il suffit de les trouver dans la doc (voir l'assistant de Qt). Par exemple, "keyPressEvent" permet de traiter les entrées clavier, caractère par caractère. Idem pour la souris: mousePressEvent, mouseMoveEvent, wheelEvent, etc...
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    788
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 788
    Points : 446
    Points
    446
    Par défaut
    Merci pour votre réponse

    Cela me rassure, mon raisonnement est le bon
    Mais je n'arrive pas à faire la suite
    Je me suis un peu inspiré de ce sujet : http://www.developpez.net/forums/d11...light=combobox
    au premier clique , garder le comportement normal, au deuxième valider la sélection
    Mais j'ai l'impression que l’événement mousePress ne correspond pas à celui ou on choisi la valeur dans la combobox. Savez vous quel est cet événement ?
    Le savoir est une arme alors soyons armés

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Je ne sais pas vous aider plus si je ne comprends pas bien ce que vous voulez faire.

    En tout cas, je vous suggère de vous y prendre en 2 temps:
    - mettre au point le combobox perso (dans une simple fenêtre) => que doit-il faire de spécial?
    - l'intégrer ensuite dans le QTableView.

    En effet, quand on navigue dans le QTableView et qu'on clique sur une case qui a un combobox, ON N'est PAS dans le combobox, mais dans la case du QTableView. Ce n'est que lorsqu'on "insiste" (entrée clavier, double-clic, ...) qu'on rentre dans le mode édition. Et dans l'autre sens, on sort du mode édition en faisant quelque chose (tab, flèches, entrée, clic dans une autre case, ...).

    C'est ce qui explique que le delegate a en fait 3 méthodes à considérer:
    - createEditor qui dit quel widget on met dans quelle case (un lineedit par défaut). Avec une base de données, ça marche par colonne.
    - setEditorData qui dit ce qu'on fait quand on rentre dans le mode édition
    - setModelData qui dit comment on prend en compte la valeur lors de la sortie du mode édition.

    Le fonctionnement du combobox n'est pleinement opérationnel pour l'utilisateur que pendant le mode édition, c'est à dire entre les 2 dernières méthodes. Pour mieux comprendre, on peut d'ailleurs créer un combobox avec une couleur verte (par exemple) pour constater qu'on ne voit le vert que pendant l'édition.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    L'explication de Tyrtamos est on ne peut plus limpide, je parlerai d'autres choses.

    Qu'est-ce que tu appelles 'comportement normal avec le clavier' ?

    Ensuite je vois dans ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    editor.addItems(self.comboItems())
    Qu'est-ce que ce comboItems() ?

    Et, enfin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    editor.activated[int].connect(fc)
    sera mieux ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    editor.activated.connect(fc)

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    788
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 788
    Points : 446
    Points
    446
    Par défaut
    Bonjour
    merci pour votre aide et désolé pour le manque de clarté

    En effet, quand on navigue dans le QTableView et qu'on clique sur une case qui a un combobox, ON N'est PAS dans le combobox, mais dans la case du QTableView. Ce n'est que lorsqu'on "insiste" (entrée clavier, double-clic, ...) qu'on rentre dans le mode édition. Et dans l'autre sens, on sort du mode édition en faisant quelque chose (tab, flèches, entrée, clic dans une autre case, ...).
    Ce que je désire est que lorsque j'utilise la souris, de pouvoir valider ma valeur (c'est à dire sortir du tableview et que la valeur afficher dans la case soit celle que j'ai choisi) sans à avoir à appuyer sur entrée ou autre
    Alors que si j'utilise le clavier, garder le comportement normal: c'est à dire valider à l'aider de la touche entrée ou tab ....


    Qu'est-ce que ce comboItems() ?
    C'est la fonction qui me permet de définir les valeurs possible de ma combobox. Celle ci me renvoi bien le résultat désirée donc je pense qu'elle est correcte


    Je me concentre à présent sur l"événement focusInEvent qui semble être celui qui m’intéresse
    Je ne comprend pas comment savoir quelle valeur a été sélectionné afin de modifier le currentText ?
    Le savoir est une arme alors soyons armés

  7. #7
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Ok, c'est une fonction qui est dans la même classe.

    Normalement, avec ton signal activated, tu dois obtenir ce que tu veux.

    Je viens de tester, avec Tab je me positionne dans la cellule qui contient une comboBox, je tape ensuite les premières lettres de l'item que je veux (cela implique que je connaisse le contenu de ma liste) et à chaque changement de l'item j'ai bien le signal qui est émit et l'item choisit devient l'item courant.

    Ce n'est pas ce que tu obtiens ?

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    788
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 788
    Points : 446
    Points
    446
    Par défaut
    Effectivement, en rapatriant la fonction dans la classe ComBoBox (héritière de QComboBox) , j'arrive enfin au résultat voulu
    Pour ceux qui aurait le même problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    class ComboDelegate(QtGui.QItemDelegate):
     
        def __init__(self, parent):
            super(Delegate,self).__init__(parent)
     
        def createEditor(self,parent,option,index):
            editor = QtGui.QComboBox(parent)
            editor.addItems(self.comboItems())
            return editor
     
        def setEditorData(self,editor):
            if type(editor) == QtGui.QLineEdit:
                editor.setText(editor.text())
     
            elif type(editor) == ComboBox:
                editor.setEditText(editor.CurrentText())
     
     
    class ComboBox(QtGui.QComboBox): 
        def __init__(self, deleg, parent=None):
            super(ComboBox, self).__init__(parent)
            self.deleg = deleg 
            self.nbClic = 0
     
        def focusInEvent(self, event):
            if self.nbClic >0:
                def fc(x):
                    self.deleg.commitData.emit(self)
                    self.deleg.closeEditor.emit(self, QtGui.QAbstractItemDelegate.NoHint)
     
                self.activated[int].connect(fc)
            self.nbClic += 1
    Le savoir est une arme alors soyons armés

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/05/2012, 15h09
  2. liste combo box s'appuyant sur des champs différents
    Par Vincent_59 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 02/08/2007, 14h10
  3. Subtilité sur les combo box
    Par SuperWeight dans le forum MFC
    Réponses: 2
    Dernier message: 14/06/2007, 11h17
  4. [VBA-E] Soucis sur une Combo box
    Par bonilla dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/12/2006, 10h52
  5. [VB.NET] Declencher événement sur combo
    Par Golzinne dans le forum Windows Forms
    Réponses: 4
    Dernier message: 09/03/2006, 19h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo