2011-11-17 10 views

Répondre

18

Tout d'abord, vous devrez modifier TreeItem de garder une trace de l'état vérifié:

private: 
    ... 
    bool checked; 

et un setter et getter:

bool isChecked() const { return checked; } 
void setChecked(bool set) { checked = set; } 

Maintenant, le modèle devra être modifié afin que la vue connaît l'état de vérification:

QVariant TreeModel::data(const QModelIndex &index, int role) const 
{ 
    if (!index.isValid()) 
     return QVariant(); 

    TreeItem *item = static_cast<TreeItem*>(index.internalPointer()); 

    if (role == Qt::CheckStateRole && index.column() == 0) 
     return static_cast<int>(item->isChecked() ? Qt::Checked : Qt::Unchecked); 

    if (role != Qt::DisplayRole) 
     return QVariant(); 

    return item->data(index.column()); 
} 

et de modifier la méthode de drapeaux du modèle pour laisser vues savent que le modèle contient des éléments vérifiables:

Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const 
{ 
    if (!index.isValid()) 
     return 0; 

    Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable; 

    if (index.column() == 0) 
     flags |= Qt::ItemIsUserCheckable; 

    return flags; 
} 

Je pense que cela devrait le faire. Si vous voulez pouvoir mettre à jour l'état de vérification TreeItem lorsque l'utilisateur sélectionne et décompacte les éléments, vous devez fournir la méthode QAbstractItemModel :: setData dans votre TreeModel.

+0

Très cool! Exactement ce que je cherchais. Cependant, j'ai découvert que j'aurais dû utiliser le TreeWidget pour ce que je suis en train de construire. Merci beaucoup pour le post cependant. – Drise

+0

Pas que je puisse proposer une meilleure solution atm, mais le booléen manque de TRISTATENESS génial bien sûr. (Par exemple, pour les dossiers partiellement sélectionnés) – eMPee584

14

J'ai converti le dessus en PyQt pour mes propres buts et j'ai pensé que je partagerais.

def data(self, index, role): 
    if not index.isValid(): 
     return None 

    item = index.internalPointer(); 

    if role == Qt.CheckStateRole and index.column() == self.check_col: 
     return int(Qt.Checked if item.isChecked() else Qt.Unchecked) 

    return super(TreeModel, self).data(index, role) 


def flags(self, index): 
    if not index.isValid(): 
     return None 

    if index.column() == self.check_col: 
     flags = Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsUserCheckable 
    else: 
     flags = super(TreeModel, self).flags(index) 

    return flags 


def setData(self, index, value, role=Qt.EditRole): 
    if index.column() == self.check_col: 
     if role == Qt.EditRole: 
      return False 
     if role == Qt.CheckStateRole: 
      item = self.getItem(index) 
      item.setChecked(value) 
      self.dataChanged.emit(index, index) 
      return True 

    return super(TreeModel, self).setData(index, value, role) 
+0

Ancien sujet mais est-il possible que vous puissiez partager toute la classe? – atomSmasher

0

Voici un autre exemple complet PyQt woking utilisant QStandardItemModel:

model = QStandardItemModel() 
parent_item = model.invisibleRootItem() # type: QStandardItem 
for row in [ 
    (Qt.Unchecked, 'unchecked'), 
    (Qt.PartiallyChecked, 'partially'), 
    (Qt.Checked, 'checked') 
]: 
    checked, text = row 
    check_item = QStandardItem('') 
    check_item.setCheckable(True) 
    check_item.setCheckState(checked) 
    parent_item.appendRow([check_item, QStandardItem(text)]) 
treeview.setModel(model) 

BTW, cela devrait aussi fonctionner pour toutes les applications C++.