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 :

Récupérer les valeurs des cellules avec QWidget.TabFocus et QWidget.ClickFocus [QtCore]


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 297
    Par défaut Récupérer les valeurs des cellules avec QWidget.TabFocus et QWidget.ClickFocus
    Bonjour
    j'ai un tableau que j'aimerais récupérer ses valeurs saisies par l'utilisateur.
    j'arrive à les récupérer en cliquant sur un bouton et après avoir rempli toutes les cellules mais c'est pas du tout ca ce que je souhaite faire .
    mon objectif c'est de récupérer le contenu de chaque cellule à chaque fois que l'utilisateur passe à la cellule suivante (en cliquant sur la touche tab ou en utilisant la souris )
    merci

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Si le tableau est un QTableWidget, il existe un signal qui devrait te permettre de faire ça: il sera émis à chaque fois que le focus passera d'une cellule à une autre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    currentCellChanged ( int currentRow, int currentColumn, int previousRow, int previousColumn )
    Il faudra peut-être (à vérifier) ajouter le cas où le focus passera d'une case à un autre widget que le tableau. On doit pouvoir faire ça avec le signal:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    focusOutEvent ( QFocusEvent * )
    Tyrtamos

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 297
    Par défaut
    d'après ce que j'ai lu
    il faut que j'active le focus avec un clic et avec une tabulation en utilisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        self.setFocusPolicy(QtGui.StrongFocus)
    mais ca me renvoie un message d'erreur :
    self.setFocusPolicy(QtGui.StrongFocus)
    AttributeError: 'module' object has no attribute 'StrongFocus'

    d'ailleurs j'ai cherché sur le site www.developpez.net mais j'ai pas trouvé un cours qui explique ca

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 297
    Par défaut
    j'ai enlevé le message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.setFocusPolicy(QtCore.Qt.StrongFocus)
    mais rien n'est claire dans ma tête
    comment je peux faire pour que je récupère la valeur de cellule à chaque fois que je saisisse et je me déplace vers la cellule suivante

  5. #5
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Je t'ai fait un petit code sans prétention qui devrait faire ce que tu souhaites (Python 2.7):

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    import sys
    from PyQt4 import QtCore, QtGui
     
    #############################################################################
    def metcase(table, row, col, val):
        """met la valeur val dans la case [row, col] de la table QTableWidget"""
        item = table.item(row, col)
        if item == None:
            # la case n'a jamais été initialisée
            item = QtGui.QTableWidgetItem(val)
            table.setItem(row, col, item)
        else:
            item.setText(val)
     
    #############################################################################
    def prendcase(table, row, col):
        """Retourne la valeur de la case [row, col] de la table QTableWidget"""
        item = table.item(row, col)
        if item == None:
            return u""
        else:
            return unicode(item.text())
     
    #############################################################################
    class Fenetre(QtGui.QWidget):
     
        # =======================================================================
        def __init__(self, parent=None):
            super(Fenetre, self).__init__(parent)
     
            self.lineEdit = QtGui.QLineEdit(self)
     
            self.tableWidget = QtGui.QTableWidget(self)
            self.tableWidget.setGeometry(QtCore.QRect(0, 30, 361, 301))
            nblig, nbcol = 5, 3
            self.tableWidget.setColumnCount(nbcol)
            self.tableWidget.setRowCount(nblig)
     
            # initialise toutes les cases
            for i in xrange(0,nblig):
                for j in xrange(0,nbcol):
                    metcase(self.tableWidget, i, j, u"")
     
            # installation d'un filtrage d'évènements pour tableWidget
            self.tableWidget.installEventFilter(self)
     
            # lancera la méthode saisieval à chaque changement de case
            QtCore.QObject.connect(self.tableWidget, QtCore.SIGNAL('currentCellChanged(int,int,int,int)'), self.saisieval)
     
     
        # =======================================================================
        def eventFilter(self, obj, event):
            """Filtrages des évènements"""
            if obj == self.tableWidget:
                if event.type() == QtCore.QEvent.FocusOut:
                    lig = self.tableWidget.currentRow()
                    col = self.tableWidget.currentColumn()
                    val = prendcase(self.tableWidget, lig, col)
                    self.lineEdit.setText(val)
                    return True
                else:
                    return False
            else:
                # transmission au parent de la fenêtre
                return QtGui.QWidget.eventFilter(obj, event)
     
        # =======================================================================
        def saisieval(self, lig, col, lig0, col0):
            """Méthode lancée à chaque changement de case du tableau"""
            val = prendcase(self.tableWidget, lig0, col0)
            self.lineEdit.setText(val)
     
    #############################################################################
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        fen = Fenetre()
        fen.show()
        sys.exit(app.exec_())
    Les fonctions prendcase et metcase permettent de lire/écrire dans les cases. A condition, bien sûr, qu'il n'y ai pas de widget particulier dedans (combobox, etc...).

    Lors de l'initialisation du tableau, je remplis toutes les cases par une chaine vide.

    Le changement de case déclenche le signal currentCellChanged qui lance la méthode saisieval. Celle-ci va lire la valeur de la case quittée et envoie sa valeur dans le lineEdit.

    La perte de focus du tableau (si on clique dans le lineEdit par exemple) déclenche un évènement qui est filtrée par la méthode eventFilter, et qui envoie aussi la valeur quittée dans le lineEdit.

    N'hésite pas à poser des questions sur ce code.

    Tyrtamos

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 297
    Par défaut
    j'ai pas trop compris l’intérêt de la méthode eventFilter
    pourquoi on a besoin de cette méthode, alors que la méthode saisieval récupère la valeur saisie et l'envoie à lineEdit

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 297
    Par défaut
    Citation Envoyé par tyrtamos Voir le message

    Les fonctions prendcase et metcase permettent de lire/écrire dans les cases. A condition, bien sûr, qu'il n'y ai pas de widget particulier dedans (combobox, etc...).
    si il y a des combobox dans les cellules ? dans ce cas on clique plus sur la celle mais on sélectionne comment on peut recuperer la valeur de la sélection avant de passer à la cellule suivante ? je note que dans ce cas le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a=self.liste.currentText()
    ne fonctionne plus ....
    pour ton code je l'ai fait tourné avec ce que je développe mais toujours un problème pour récupérer la dernière case
    au faite mon souci ce que je dois repester l'architecture mvc , donc ce n'est pas du tout évident de séparer le code vue du code contrôleur et modèle

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/11/2013, 15h16
  2. [XL-2003] Garder uniquement les valeurs des cellules avec PasteSpecial et With Worksheets
    Par tibs1502 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 06/02/2013, 14h57
  3. Réponses: 3
    Dernier message: 10/05/2012, 20h31
  4. Réponses: 6
    Dernier message: 21/12/2009, 11h08
  5. Réponses: 2
    Dernier message: 10/02/2009, 16h03

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