¿Cómo puede fallar el método `setData`?

Oct 01 2020

La documentación QAbstractItemModel.setData, que he reproducido a continuación, dice que el método debe devolver verdadero si tiene éxito o falso en caso contrario. Mi pregunta es la siguiente: ¿Cómo puede este método no tener éxito?

bool QAbstractItemModel :: setData (const QModelIndex & index, const QVariant & value, int role = Qt :: EditRole)

Establece los datos de función para el elemento en el índice en valor.

Devuelve verdadero si tiene éxito; de lo contrario, devuelve falso.

La señal dataChanged () debería emitirse si los datos se establecieron correctamente.

La implementación de la clase base devuelve falso. Esta función y datos () deben volver a implementarse para modelos editables.

Nota: Esta función puede invocarse a través del sistema de metaobjetos y desde QML. Consulte Q_INVOKABLE.

Consulte también Qt :: ItemDataRole, data () y itemData ().

Respuestas

2 eyllanesc Oct 01 2020 at 04:32

El objetivo del valor de retorno de setData () es indicar si se editó o no la información asociada al rol y al QModelIndex, y dependerá del desarrollador si devuelve verdadero o falso.

Algunos ejemplos que ilustran lo anterior:

  • Si desea que su modelo no sea editable (que por defecto es cualquier modelo), devuelva siempre falso.

  • Si desea que solo algunos elementos sean editables o no, devolverá verdadero o falso según el elemento.

  • Si desea que el nuevo valor cumpla con ciertas restricciones. Un ejemplo práctico podría ser si los elementos a editar deben tener edades, por lo que para valores negativos debe devolver falso y para los demás casos verdadero.

1 Steve Oct 01 2020 at 04:33

El método está en una clase abstracta y se puede anular. Si se sobrescribe, puede pasar cualquier cosa en esa nueva implementación, ¿verdad?

La implementación de la clase base devuelve falso. Esta función y datos () deben volver a implementarse para modelos editables.

Por lo tanto, no solo es posible que se anule, incluso es necesario en algunos casos. Lo que significa "exitoso" depende del implementador del método de reemplazo, y puede devolver trueo false.