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

  1. #1
    Membre régulier
    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
    Points : 93
    Points
    93
    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 éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 478
    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 478
    Points : 9 278
    Points
    9 278
    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 régulier
    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
    Points : 93
    Points
    93
    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 régulier
    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
    Points : 93
    Points
    93
    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 éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 478
    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 478
    Points : 9 278
    Points
    9 278
    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 régulier
    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
    Points : 93
    Points
    93
    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 régulier
    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
    Points : 93
    Points
    93
    Par défaut
    une autre question pourquoi on initialise les cases à vides ? je vois pas l'objectif de cette initialisation ...

  8. #8
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 478
    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 478
    Points : 9 278
    Points
    9 278
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Pour eventFilter:

    Si tu veux récupérer le contenu de la case quand on passe à une autre case, saisieval est suffisant.

    Je n'ai ajouté enventFilter que pour pouvoir récupérer le contenu d'une case quand on sort du tableau pour aller sur un autre widget. En effet, dans ce cas, la méthode saisieval ne sera pas appelée.

    C'est à toi de savoir ce que tu souhaites, et en fonction, de mettre eventFilter ou pas.

    Pour l'initialisation des cases du tableau:

    Il faut savoir que lorsqu'on a construit un tableau avec QTableWidget, chaque case ne contient RIEN: même pas de quoi saisir un contenu, et encore moins de le lire. Pour qu'une case puisse contenir quelque chose, il faut lui "brancher" un widget. Au minimum, c'est QTableWidgetItem, mais ça peut être un combobox ou autre. Et le widget choisi est lié à la case avec setItem.

    Alors, pour être tranquille, j'initialise toutes les cases au début. Mais tu n'es pas obligée: il faudra simplement que par la suite, tu n'essaies pas le lire ou écrire une case qui ne contient rien (même pas une chaine vide...).

    Tyrtamos

  9. #9
    Membre régulier
    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
    Points : 93
    Points
    93
    Par défaut
    mais si on saisit dans la dernière cellule (ligne 5 et colonne 3) on pourra plus récupérer car il n'y a pas de cellule suivante

  10. #10
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 478
    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 478
    Points : 9 278
    Points
    9 278
    Billets dans le blog
    6
    Par défaut
    Eh, oui, c'est juste: la méthode n'est appelée que lorsqu'on change de case, mais quand on arrive aux limites du tableau, les flèches ne peuvent pas conduire à dépasser ces limites, et la case ne change plus!

    A toi de dire ce que tu voudrais qu'il se passe dans ce cas!

    Tyrtamos

  11. #11
    Membre régulier
    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
    Points : 93
    Points
    93
    Par défaut
    ca veut dire que cette méthode n'est pas fiable , si elle arrive seulement à récupérer toutes les valeurs de cases sans la dernière case
    ce que j'aimerais faire c'est de pouvoir récupérer toutes les valeurs des cases

  12. #12
    Membre régulier
    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
    Points : 93
    Points
    93
    Par défaut
    vue que j'ai créé le tableau avec QT Creator j'arrive pas à récupérer le numéro de la colonne
    quand je suis dans une cellule je sais c'est quelle ligne mais pas quelle colonne
    du coup la méthode considère que je suis dans la cellule : (ligne 1 ,colonne1) ; (ligne 2 ,colonne1 ); (ligne n ,colonne 1) etc

  13. #13
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 478
    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 478
    Points : 9 278
    Points
    9 278
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par nancy maman Voir le message
    ca veut dire que cette méthode n'est pas fiable , si elle arrive seulement à récupérer toutes les valeurs de cases sans la la dernière case
    moi ce que j'aimerais c'est de pouvoir récupérer toutes les valeurs des cases
    Cette méthode est très fiable (c'est à dire produit toujours les mêmes effets), mais ne correspond pas aux besoins que tu n'as pas exprimé... Sur le plan méthodologique, ça s'appelle: "mettre la charrue avant les bœufs"!

    Pour remettre les choses dans l'ordre (besoins => solution), précise un peu mieux ce que tu veux faire. Par exemple:

    1- Je circule dans le tableau avec les 4 flèches de direction:

    A chaque changement de case, je lis la valeur de la case.
    - flèche à droite: arrivé à la dernière colonne, la case courante revient à la 1ère colonne de la même ligne (ou de la ligne suivante?)
    - flèche à gauche: arrivé à la 1ère colonne, la case courante va à la dernière colonne de la même ligne (ou de la ligne précédente?)
    - flèche en bas: etc...
    - flèche en haut: etc...

    A noter qu'il y a plusieurs "flèches" sur la clavier: faut-il prendre aussi celles du clavier numérique?

    Faut-il ajouter les 4 touches: début, fin, page_up, page_down ? Et si oui, elles doivent faire quoi?

    2-Décrit en plus ce qui se doit se passer si tu tapes sur une flèche alors que tu es en train de saisir une donnée sans l'avoir validée avec la touche entrée.

    NB: quand on est en train de saisir une donnée dans une case, les flèches en haut et en bas changent la case, mais pas les flèches à gauche et à droite puisqu'elles font partie des facilités de saisie de la case.

    3- Enfin, qu'est-ce qui doit se passer avec les clics de souris:
    - dans une case différente du tableau
    - dans un autre widget de la fenêtre
    - dans une autre fenêtre

    En résumé: confirme ton besoin, et on trouvera (presque toujours) les solutions.

    Tyrtamos

  14. #14
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 478
    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 478
    Points : 9 278
    Points
    9 278
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par nancy maman Voir le message
    vue que j'ai créé le tableau avec QT Creator j'arrive pas à récupérer le numéro de la colonne
    .currentColumn() ?

    Tyrtamos

  15. #15
    Membre régulier
    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
    Points : 93
    Points
    93
    Par défaut
    merci
    mon tableau je l'ai créé avec QT Creator avec des modifications manuelle .
    le nombre de colonne je le connais c'est fixe =3
    le nombre de ligne dépend d'un nombre que je donne moi en entrée .
    donc quand je précise: nombre de ligne=2 et je clique sur entrer
    mon tableau généré aura 3 colonne et 2 ligne
    maintenant je veux récupérer le contenu de la cellule à chaque fois que je clique sur la cellule suivante (en utilisant les flèches , tabulation ou la souris )
    ton code marche bien (à part la dernière cellule ) mais j'arrive pas à l'adapter à mon travail pour la simple raison : la méthode est appelé lors de la création des lignes du tableau , voici le code qui permet de créer les lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    nb=0
    nombreligne=2
    while nb<nombreligne:
                item = QtGui.QTableWidgetItem()
                self.table.setVerticalHeaderItem(nb, item)
              
                QtCore.QObject.connect(self.table, QtCore.SIGNAL('currentCellChanged(int,int,int,int)'), self.methodeCellule(nb,colonne))
    j'ai essayé de passer en paramètre le numéro de la ligne et le numéro de la colonne de la cellule mais au moment ou on appel methodeCellule on connait on est dans quelle ligne mais pas dans quelle colonne

    la méthode methodeCellule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def methodeCellule(self, lig, col):
            a=self.table.item(lig,col)
            print a.data(0).toString()
    si c'est pas toujours claire je pourrai expliquer avec plus de code

    le probleme ce que à chaque fois que je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QtCore.QObject.connect(self.table, QtCore.SIGNAL('currentCellChanged(int,int,int,int)'), self.methodeCellule(nb,colonne))
    il faut que j'arrive à déterminer la ligne et la colonne de la cellule pour que je le passe à la méthode : methodeCellule qui récupère le contenu de la cellule , c'est ça l'idée

  16. #16
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 478
    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 478
    Points : 9 278
    Points
    9 278
    Billets dans le blog
    6
    Par défaut
    C'est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    QtCore.QObject.connect(self.table, QtCore.SIGNAL('currentCellChanged(int,int,int,int)'), self.methodeCellule)
    Dans les 2 'int' passés à methodeCellule(row1, col1, row0, col0), les 2 premiers sont: row et col nouveaux, et les 2 derniers sont: row et col anciens

    C'est dans mon code.

    Tyrtamos

  17. #17
    Membre régulier
    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
    Points : 93
    Points
    93
    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

  18. #18
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 302
    Points : 6 782
    Points
    6 782
    Par défaut
    Citation Envoyé par nancy maman Voir le message
    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
    Si l'anglais ne te pose pas trop de soucis, Mark Summerfield parle abondamment de l'architecture MVC dans son dernier bouquin

    "Rapid GUI Programming with Python and Qt"

    Une version pdf existe, google te confirmera.


    Edit: Si tu es sous Linux:

    wget http://dc96.4shared.com/download/KmA...12606-bd55b297

  19. #19
    Membre régulier
    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
    Points : 93
    Points
    93
    Par défaut
    je suis pas sous lunix et mon niveau en anglais est trop faible

  20. #20
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 478
    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 478
    Points : 9 278
    Points
    9 278
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par nancy maman Voir le message
    si il y a des combobox dans les cellules ?
    Voilà comment modifier la fonction prendcase pour lire aussi la valeur du combobox:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    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:
            if issubclass(type(table.cellWidget(row,col)), QtGui.QComboBox):
                item = table.cellWidget(row,col) 
                return item.currentText() 
            return u""
        else:
            return unicode(item.text())
    En effet, si une case ne contient pas de QTableWidgetItem, alors self.tableWidget.item(row,col) renvoie None. Dans ce cas, on peut tester avec issubclass si c'est un combobox ou autre chose (checkbox, etc...), afin de savoir comment lire la donnée. Si ça ne contient rien, on renvoie une chaine vide, ce qui évite de générer une erreur si la case n'a jamais été initialisée.

    Citation Envoyé par nancy maman Voir le message
    mais toujours un problème pour récupérer la dernière case
    Tu n'as toujours pas dis ce que tu voulais que ça fasse (voir mon message #13).

    J'avais commencé avec les 4 flèches habituelles pour naviguer dans le tableau, mais la solution avec les flèches a des inconvénients avec:
    - le texte en cours de saisie (flèches droit et gauche)
    - le texte affichée dans le combobox (flèche haute et basse)
    ceci parce que les flèches font alors partie des facilités d'édition de ces widgets.

    Aussi, je pense que la solution à recommander passe par les tab et maj-tab qui, eux, fonctionnent très bien. On circule en zig-zag de la case en haut à gauche à la case en bas à droite. Ça marche aussi en cas d'édition, et ça marche aussi en passant sur le combobox.

    Voilà la solution avec tab et maj-tab. J'ai simplifié le code au maximum:

    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # Python 2.7
     
    import sys
    from PyQt4 import QtCore, QtGui
     
    #############################################################################
    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:
            # soit la case n'a jamais été initialisée, soit elle a un widget
            if issubclass(type(table.cellWidget(row,col)), QtGui.QComboBox):
                # c'est un combobox: renvoyer la valeur affichée
                item = table.cellWidget(row,col) 
                return unicode(item.currentText()) 
            # la case ne contient rien: renvoyer une chaine vide
            return u""
        else:
            return unicode(item.text())
     
    #############################################################################
    class Fenetre(QtGui.QWidget):
     
        # =======================================================================
        def __init__(self, parent=None):
            super(Fenetre, self).__init__(parent)
     
            # créer le lineEdit
            self.lineEdit = QtGui.QLineEdit(self)
     
            # créer le tableau
            self.tableWidget = QtGui.QTableWidget(self)
            self.tableWidget.setGeometry(QtCore.QRect(0, 30, 361, 301))
            self.nbrow, self.nbcol = 5, 3
            self.tableWidget.setRowCount(self.nbrow)
            self.tableWidget.setColumnCount(self.nbcol)
     
            # on met un combobox en [row=1, col=1]
            self.listecombo = ['toto', 'titi', 'tata', 'tutu']
            self.combo = QtGui.QComboBox()
            self.combo.addItems(self.listecombo)
            self.rowcombo, self.colcombo = 1, 1
            self.tableWidget.setCellWidget(self.rowcombo, self.colcombo, self.combo)
     
            # lancera la méthode saisieval à chaque changement de case
            QtCore.QObject.connect(self.tableWidget, QtCore.SIGNAL('currentCellChanged(int,int,int,int)'), self.saisieval)
     
            # mettre le focus sur la case [0,0] du tableau
            self.tableWidget.setFocus()
            self.tableWidget.setCurrentCell(0, 0)
     
        # =======================================================================
        def saisieval(self, row, col, row0, col0):
            """Méthode lancée à chaque changement de case du tableau
               row, col = coordonnées de la nouvelle case
               row0, col0 = coordonnées de l'ancienne case
            """
            val = prendcase(self.tableWidget, row0, col0)
            self.lineEdit.setText(val)
     
    #############################################################################
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        fen = Fenetre()
        fen.show()
        sys.exit(app.exec_())
    Ok?

    Tyrtamos

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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