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 :

QTableWidgetItem et flags [QtGui]


Sujet :

PyQt Python

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 6
    Points : 2
    Points
    2
    Par défaut QTableWidgetItem et flags
    Bonjour à tous,

    Je tiens d'abord à vous remercier en vous disant que grâce à l'ensemble des posts (et surtout des réponses) dans ce forum, de nombreuses questions que je me posais ont été résolues sans que je prenne la peine de les poser. Donc merci à vous tous.

    Voilà le problème qu'il se pose à moi et qui me fait me tourner vers vous aujourd'hui: je suis en train de faire une interface graphique pour un programme que j'ai développé. Ce programme traite des données de métrologie optique, et ce afin de suivre l'évolution de la gravure de composants microélectroniques en temps réels. Voilà pour le contexte.

    Je vais mettre le code que je développe plus loin, laissez moi décrire d'abord mon problème.

    La résolution de ce programme est différente selon la géométrie du composant, c'est pourquoi je demande à l'utilisateur de spécifier la géométrie utilisée pour la résolution du problème (via des checkbox). Chaque géométrie à des dimensions propres, que l'utilisateur peut spécifier via l'utilisation d'un QTableWidget.

    Mon problème est le suivant : je veux que lorsque l'utilisateur choisi une géométrie donnée, les cellules du QTableWidget éditables soient uniquement celles correspondant à la géométrie, c'est à dire que lorsque je clique sur la check box correspondantes, toutes les dimensions non nécessaires soient non éditables. Ca, c'est bon, je sais le faire grace au QTableWidgetItem.setFlags(QtCore.Qt.ItemIsEditable).

    Le problème que je rencontre est plutôt l'inverse. Je veux que lorsque je décoche la checkbox, toutes les cellules qui ont été desactivées se réactivent. Et la je bloque, j'ai bien essayé un ~QtCore.Qt.ItemIsEditable ou un QtCore.Qt.ItemNoFlags, rien n'y fait. Quelqu'un aurait une idée?

    Voilà l'architecture du code me posant 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
    def __init__(self,parent=None):
    ## initialisation du tableau, Table est un QTableWidget ##
        self.Table.setRowCount(1)
        self.Table.setColumnCount(18)
        self.connectActions()
     
    def connectActions(self):
        self.RectangleGeom_CheckBox.clicked.connect(self.StateCell) ## RectangleGeom_CheckBox est une des checkbox permettant de choisir la géométrie du composant ##
     
    def StateCell(self):
        if(self.RectangleGeom_CheckBox.isChecked()):
        ## On desactive des cellules, ça ok, ça marche ##
            for j in [0,2,3,4,6]: ## coordonnées des cellules qui doivent être desactivées ##
                item=QtGui.QTableWidgetItem()
                item.setFlags(QtCore.Qt.ItemIsEditable)
                self.Table.setItem(0,j,item)
        else :
        ## dans le cas contraire, les cellules doivent être réactivées ##
            for j in [0,2,3,4,6]:
                item=QtGui.QTableWidgetItem()
                ## et là, je sais pas, ça fonctionne pas, des idées? ##
                item.setFlags(~QtCore.Qt.ItemIsEditable)
                self.Table.setItem(0,j,item)
    En espérant avoir été assez précis. N'hésitez pas à me demander si des questions persistent.

    Merci à vous !

    Koamh

  2. #2
    Membre habitué
    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
    Points : 156
    Points
    156
    Par défaut
    Essaie ceci :
    setFlags( QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled)

    tu peux mettre plusieurs flags

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci de ta réponse,

    En fait, j'avais déjà essayé ce genre de chose, au temps pour moi, j'ai oublié de le signaler...

    J'ai un peu remanier mon code depuis ce matin, et j'ai ainsi implémenté deux fonctions permettant de changer les flags :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def enableEdit(self,Item): ## Item étant un QTableWidgetItem ##
        eFlags=Item.flags()
        eFlags|=QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEditable
        return eFlags
     
    def disableEdit(self,Item):
        eFlags=Item.flags()
        eFlags &= ~(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable )
        return eFlags
    Ce que je trouve bizarre est que je peux intervertir exactement les deux fonctions, ça me donnera le même résultats : les cellules sont desactivées...

    Où ai-je fais la boulette?

  4. #4
    Membre habitué
    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
    Points : 156
    Points
    156
    Par défaut
    j'ai l'impression que tu concatènes des flags au fur et à mesure..

    exemple de code ok rapidos chez moi:
    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
     
    # -*- coding: utf-8 -*-
    from PyQt4 import QtGui,QtCore
     
    EDITABLE = QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled
    NONEDITABLE = QtCore.Qt.ItemIsEnabled
     
    class maFen(QtGui.QWidget):
      def __init__(self,parent=None):
        super(maFen,self).__init__(parent)
        self.setLayout(QtGui.QVBoxLayout())
     
        self.up = QtGui.QWidget()
        self.up.setLayout(QtGui.QHBoxLayout())
        self.up.setFixedHeight(50)
        self.but = QtGui.QPushButton("EDITABLE")
     
        self.up.layout().addWidget(self.but)
        self.up.layout().addStretch()
     
        self.table = QtGui.QTableWidget()
        self.table.setColumnCount(3)
        self.table.setRowCount(2)
     
        self.layout().addWidget(self.up)
        self.layout().addWidget(self.table)
     
        self.remplir()
        self.connect (self.table, QtCore.SIGNAL ("itemClicked (QTableWidgetItem *)"), self.clickItem)
        self.but.clicked.connect(self.pushButt)
     
     
      def remplir(self):
        for r in range(2):
          for c in range(3):
            it = QtGui.QTableWidgetItem(str(2*r+c))
            it.setFlags(EDITABLE)
            self.table.setItem(r,c,it)
     
      def clickItem(self,it):
        if it.flags() == EDITABLE:
          self.but.setText("EDITABLE")
        else:
          self.but.setText("NON EDITABLE")
     
      def pushButt(self):
        it = self.table.currentItem()
        if it.flags() == EDITABLE:
          it.setFlags(NONEDITABLE)
        else:
          it.setFlags(EDITABLE)
        self.clickItem(it)
     
     
     
     
    if __name__=='__main__':
      import sys
      app=QtGui.QApplication(sys.argv)
     
     
      fen = maFen()
      fen.show()
      sys.exit(app.exec_())

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Bon ben, j'ai modifié mon code avec tes recommandations (en gros j'ai pompé ton code), et ça marche.

    J'ai toujours pas compris pourquoi, mais bon...

    En tout cas un grand merci à toi !

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

Discussions similaires

  1. [MFC] Flags sur OnKeyDown
    Par nico-pyright(c) dans le forum MFC
    Réponses: 5
    Dernier message: 03/10/2005, 10h00
  2. Réponses: 1
    Dernier message: 11/09/2005, 02h04
  3. [Débutant]Fonction avec des flags
    Par @r$£~%[ dans le forum C++
    Réponses: 10
    Dernier message: 22/08/2005, 10h19
  4. [langage] Flags et listes
    Par claire14pb dans le forum Langage
    Réponses: 22
    Dernier message: 23/05/2005, 22h54
  5. Flags ??
    Par foussa dans le forum Assembleur
    Réponses: 21
    Dernier message: 19/10/2002, 18h36

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