como o método `setData` pode falhar?

Oct 01 2020

A documentação para QAbstractItemModel.setData, que reproduzi abaixo, diz que o método deve retornar verdadeiro se for bem-sucedido ou falso caso contrário. Minha pergunta é a seguinte: Como esse método pode não ter sucesso?

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

Define os dados da função para o item no índice para valor.

Retorna verdadeiro se for bem-sucedido; caso contrário, retorna falso.

O sinal dataChanged () deve ser emitido se os dados forem configurados com sucesso.

A implementação da classe base retorna falso. Esta função e data () devem ser reimplementados para modelos editáveis.

Nota: Esta função pode ser chamada por meio do sistema de meta-objeto e do QML. Consulte Q_INVOKABLE.

Veja também Qt :: ItemDataRole, data () e itemData ().

Respostas

2 eyllanesc Oct 01 2020 at 04:32

O objetivo do valor de retorno de setData () é indicar se a informação associada à função e ao QModelIndex foi editada e dependerá do desenvolvedor se retorna verdadeiro ou falso.

Alguns exemplos que ilustram o acima:

  • Se você deseja que seu modelo não seja editável (que por padrão é qualquer modelo), sempre retorne falso.

  • Se você quiser que apenas alguns itens sejam editáveis ​​ou não, você retornará verdadeiro ou falso dependendo do item.

  • Se você deseja que o novo valor atenda a certas restrições. Um exemplo prático poderia ser se os itens a editar devem ter idades, portanto, para valores negativos, ele deve retornar falso e, para os outros casos, verdadeiro.

1 Steve Oct 01 2020 at 04:33

O método está em uma classe abstrata e pode ser substituído. Se for substituído, tudo pode acontecer nessa nova implementação, certo?

A implementação da classe base retorna falso. Esta função e data () devem ser reimplementados para modelos editáveis.

Portanto, não só é possível que seja sobrescrito, como até mesmo necessário em alguns casos. O que "sucesso" significa depende do implementador do método de substituição, e ele pode retornar trueou false.