2010-04-15 4 views
1

J'ai essayé pendant quelques jours de comprendre pourquoi mon QAbstractLisModel ne permettra pas à un utilisateur de basculer un élément vérifiable dans trois états. Le modèle renvoie les Qt.IsTristate et Qt.ItemIsUserCheckable dans la méthode flags(), mais lorsque le programme s'exécute, seuls Qt.Checked et Qt.Unchecked sont activés lors de l'édition.PyQt QAbstractListModel semble ignorer les drapeaux tristate

class cboxModel(QtCore.QAbstractListModel): 
    def __init__(self, parent=None): 
     super(cboxModel, self).__init__(parent) 
     self.cboxes = [ 
      ['a',0], 
      ['b',1], 
      ['c',2], 
      ['d',0] 
     ] 

    def rowCount(self,index=QtCore.QModelIndex()): 
     return len(self.cboxes) 

    def data(self,index,role): 
     if not index.isValid: return QtCore.QVariant() 
     myname,mystate = self.cboxes[index.row()] 
     if role == QtCore.Qt.DisplayRole: 
      return QtCore.QVariant(myname) 
     if role == QtCore.Qt.CheckStateRole: 
      if mystate == 0: 
       return QtCore.QVariant(QtCore.Qt.Unchecked) 
      elif mystate == 1: 
       return QtCore.QVariant(QtCore.Qt.PartiallyChecked) 
      elif mystate == 2: 
       return QtCore.QVariant(QtCore.Qt.Checked) 
     return QtCore.QVariant() 

    def setData(self,index,value,role=QtCore.Qt.EditRole): 
     if index.isValid(): 
      self.cboxes[index.row()][1] = value.toInt()[0]    
      self.emit(QtCore.SIGNAL("dataChanged(QModelIndex,QModelIndex)"), 
         index, index) 
      print self.cboxes 
      return True 
     return False 

    def flags(self,index): 
     if not index.isValid(): 
      return QtCore.Qt.ItemIsEditable 
     return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsEditable |  QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsTristate 

Vous pouvez le tester avec cela,

class MainForm(QtGui.QMainWindow): 

    def __init__(self, parent=None): 
     super(MainForm, self).__init__(parent) 

     model = cboxModel(self) 

     self.view = QtGui.QListView() 
     self.view.setModel(model) 

     self.setCentralWidget(self.view) 


app = QtGui.QApplication(sys.argv) 
form = MainForm() 
form.show() 
app.exec_() 

et de voir que seuls deux états sont disponibles. Je suppose qu'il y a quelque chose de simple qui me manque. Des idées? Merci!

Répondre

0

Vous devrez peut-être créer un emplacement personnalisé sur le signal cliqué() qui passe par les trois états. Généralement, les éléments à trois états peuvent seulement être activés et désactivés directement, et ne sont en mode partiellement vérifié que si les sous-éléments sont dans des états différents.