2011-11-17 21 views

Respuesta

18

En primer lugar, tendrá que modificar TreeItem para realizar un seguimiento del estado de activación:

private: 
    ... 
    bool checked; 

y un setter y getter:

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

Ahora tendrá que ser modificado de modo que el modelo que la vista sabe sobre el estado de verificación:

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()); 
} 

y modificar el método de indicadores de modelo para dejar vistas saben que el modelo contiene elementos que se pueden verificar:

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; 
} 

Creo que esto debería hacerlo. Si desea poder actualizar el estado de comprobación TreeItem cuando el usuario marca y elimina los elementos, deberá proporcionar el método QAbstractItemModel :: setData en su TreeModel.

+0

Very Cool! Exactamente lo que estaba buscando. Sin embargo, descubrí que debería haber estado usando el TreeWidget para lo que estoy tratando de construir. Muchas gracias por la publicación, sin embargo. – Drise

+0

No es que yo pueda proponer una mejor solución atm, pero a la booleana le falta la tremenda TRISTATENESS por supuesto. (por ejemplo, para carpetas parcialmente seleccionadas) – eMPee584

14

Convertí lo anterior a PyQt para mis propios fines y pensé que compartiría.

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

Hilo viejo, pero ¿hay alguna posibilidad de que pueda compartir toda la clase? – atomSmasher

0

Aquí hay otro ejemplo PyQt Woking completa usando 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) 

Por cierto, esto también debería funcionar para cualquier aplicación C++.

Cuestiones relacionadas