Je sais que cela a été demandé à plusieurs reprises, mais je n'arrive pas à trouver quelque chose de pertinent.QTreeView Cases à cocher
En utilisant the simpletreemodel tutorial qui est livré avec Qt, comment ajouter des cases à cocher?
Je sais que cela a été demandé à plusieurs reprises, mais je n'arrive pas à trouver quelque chose de pertinent.QTreeView Cases à cocher
En utilisant the simpletreemodel tutorial qui est livré avec Qt, comment ajouter des cases à cocher?
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.
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)
Ancien sujet mais est-il possible que vous puissiez partager toute la classe? – atomSmasher
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++.
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
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