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 :

Modifier la sélection d'un QTableWidget contenant des QComboBox


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Par défaut Modifier la sélection d'un QTableWidget contenant des QComboBox
    Bonjour,

    dans mon application, j'ai créé un QTableWidget contenant 2 colonnes: dans la première, chaque ligne contient du simple texte, et dans la deuxième chaque ligne contient un widget QComboBox.

    Un seul item peut être sélectionné à la fois.
    Je voudrais que lorsque l'utilisateur utilise une comboBox, la sélection revienne automatiquement sur la première colonne (même ligne que cette comboBox).

    Or je n'y arrive pas! J'ai connecté le signal "activated" de chaque comboBox à une fonction où j'ai écris ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.tableWidget.setCurrentCell(self.tableWidget.currentRow(), 0)
    Afin de remettre la sélection sur la première colonne, mais ce code ne donne aucune réaction!
    Par ailleurs, même si cela fonctionnait, cette fonction ne serait pas appelée si l'utilisateur clique sur la comboBox sans passer sa souris sur le menu déroulant, mais je ne vois pas de signal permettant de gérer ce comportement.

    Auriez-vous une solution?
    Merci d'avance pour votre aide!

  2. #2
    Membre à l'essai
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Août 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2013
    Messages : 5
    Par défaut
    Bonjour,

    Je voudrais que lorsque l'utilisateur utilise une comboBox, la sélection revienne automatiquement sur la première colonne (même ligne que cette comboBox).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    self.tableWidget.setCurrentCell(0, 0)
    Serait mieux pour aller sur la première colonne

    Par ailleurs, même si cela fonctionnait, cette fonction ne serait pas appelée si l'utilisateur clique sur la comboBox sans passer sa souris sur le menu déroulant, mais je ne vois pas de signal permettant de gérer ce comportement.
    Au lieu de connecter le signal actived, connecte le signal currentIndexChanged ( int index ) comme ça des que la combox changera tu aura le signal !

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2009
    Messages : 195
    Par défaut
    Citation Envoyé par Toon34 Voir le message
    Bonjour,



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    self.tableWidget.setCurrentCell(0, 0)
    Serait mieux pour aller sur la première colonne



    Au lieu de connecter le signal actived, connecte le signal currentIndexChanged ( int index ) comme ça des que la combox changera tu aura le signal !
    Bonjour

    Attention,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    self.tableWidget.setCurrentCell(0, 0)
    raménera toujours à la première ligne, or on veut être sur la ligne du combobox il me semble.
    La difficulté est d'avoir la ligne où la combo se trouve.. Une idée serait d'attribuer à la combo la ligne où elle se trouve
    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
     
    # -*- coding: utf-8 -*- 
    from PyQt4 import QtGui, QtCore
     
    class TestTable(QtGui.QTableWidget):
      def __init__(self,parent=None):
        super(TestTable,self).__init__(parent)
        self.setRowCount(2)
        self.setColumnCount(2)
     
        combo1 = QtGui.QComboBox()
        combo1.addItems(['pomme','banane'])
        combo2 = QtGui.QComboBox()
        combo2.addItems(['brocoli','haricot'])
        combo1.row = 0
        combo2.row = 1
        self.setCellWidget(0,1,combo1)
        self.setCellWidget(1,1,combo2)
        combo1.activated.connect(self.changeCombo)
        combo2.activated.connect(self.changeCombo)
     
      def changeCombo(self,index):
        row = self.sender().row
        self.setCurrentCell(row, 0)
     
    if __name__=='__main__':
      import sys
      app=QtGui.QApplication(sys.argv)
     
      fen = TestTable()
      fen.show()
      sys.exit(app.exec_())
    Attention, il est préconisé d'utiliser un signalmapper au lieu de self.sender() mais je me suis pas encore trop documenté la dessus.

    Y a sans doute mieux que cette solution, je suis intéressé si quelqu'un propose autre chose

  4. #4
    Membre éclairé
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Par défaut
    Bonjour,

    merci de ta réponse,
    mais si je mets, comme tu proposes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.tableWidget.setCurrentCell(0, 0)
    Cela sélectionnera toujours la même colonne mais aussi toujours la première ligne, alors que je veux sélectionner la première colonne mais pour la ligne où se trouve la comboBox qui a été utilisée.

    De plus, avec le signal currentIndexChanged, il ne sera activé que lorsque la sélection a été modifiée, alors que je voudrais que cela fonctionne même si l'utilisateur clique sur la comboBox sans changer de sélection.

    Le signal activated, si j'ai bien compris la doc, fait la même chose que currentIndexChanged mais est également appelée lorsque la sélection n'a pas été modifiée, c'est donc ce que je veux.
    Mais ce signal ne fonctionne pas si l'utilisateur clique seulement sur le comboBox lui-même sans passer sa souris sur le menu déroulant. En recliquant le menu déroulant se referme sans que la sélection n'ait changé. A ce moment là je voudrait que le focus revienne sur la première colonne de mon QTableWidget.

    J'espère avoir été plus claire!

    EDIT: ah je n'avais as vu ta réponse Nico_Tournai, je vais tester ce que tu proposes!

  5. #5
    Membre éclairé
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Par défaut
    Merci ta technique fonctionne bien!
    Personnellement j'utilise la fonction "partial" plutôt qu'un signalMapper pour savoir quel widget a généré le signal (ce n'est pas forcément la meilleure solution non plus, mais je la trouve simple à utiliser):

    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
     
    from functools import partial
     
    class TestTable(QtGui.QTableWidget):
      def __init__(self,parent=None):
        super(TestTable,self).__init__(parent)
        self.setRowCount(2)
        self.setColumnCount(2)
     
        combo1 = QtGui.QComboBox()
        combo1.addItems(['pomme','banane'])
        combo2 = QtGui.QComboBox()
        combo2.addItems(['brocoli','haricot'])
        combo1.row = 0
        combo2.row = 1
        self.setCellWidget(0,1,combo1)
        self.setCellWidget(1,1,combo2)
        combo1.activated[int].connect(partial(self.changeCombo, combo1))
        combo2.activated[int].connect(partial(self.changeCombo, combo2))
     
      def changeCombo(self, comboBox, index):
        row = comboBox.row
        self.setCurrentCell(row, 0)
     
    if __name__=='__main__':
      import sys
      app=QtGui.QApplication(sys.argv)
     
      fen = TestTable()
      fen.show()
      sys.exit(app.exec_())
    Tout se comporte comme je le voulais!
    Il me reste seulement le problème pour le cas où la comboBox est sélectionnée mais sans que le signal activated() soit envoyé, si quelqu'un a des idées je suis preneuse!
    Merci beaucoup pour votre aide

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2009
    Messages : 195
    Par défaut
    Pratique partial, je penserais à l'utiliser les prochaines fois

    Que veux tu dire par sélectionnée sans être activée?
    si le focus est sur la combo??

  7. #7
    Membre éclairé
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Par défaut
    C'est-à-dire si la personne clique sur la comboBox puis reclique au même endroit, sans avoir changé la sélection ni même passé sa souris sur le menu déroulant qui apparaît lorsque l'on clique.
    A ce moment là ni le signal IndexChanged ni activated ne sont appelés, et je ne voit pas d'autre signal dans la doc qui correspondrait.

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/03/2013, 11h59
  2. Tri dans un QTableWidget contenant des QComboBox
    Par jo-leptipois dans le forum Qt
    Réponses: 3
    Dernier message: 22/08/2012, 23h43
  3. Réponses: 2
    Dernier message: 28/10/2008, 10h21
  4. Création d'une base de données contenant des images
    Par gandalf_le_blanc dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 16/06/2004, 15h29
  5. Cherche un site contenant des sources valables
    Par Kartofel dans le forum Debian
    Réponses: 7
    Dernier message: 14/01/2004, 14h05

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