`setData`メソッドはどのように失敗しますか?

Oct 01 2020

QAbstractItemModel.setData以下に再現したのドキュメントには、成功した場合はメソッドがtrueを返し、そうでない場合はfalseを返す必要があると記載されています。私の質問は次のとおりです。この方法がうまくいかないのはどうしてですか?

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

インデックスのアイテムのロールデータを値に設定します。

成功した場合はtrueを返します。それ以外の場合はfalseを返します。

データが正常に設定された場合、dataChanged()シグナルが発行されます。

基本クラスの実装はfalseを返します。この関数とdata()は、編集可能なモデル用に再実装する必要があります。

注:この関数は、メタオブジェクトシステムおよびQMLから呼び出すことができます。Q_INVOKABLEを参照してください。

Qt :: ItemDataRole、data()、およびitemData()も参照してください。

回答

2 eyllanesc Oct 01 2020 at 04:32

setData()の戻り値の目的は、ロールとQModelIndexに関連付けられた情報が編集されたかどうかを示すことであり、trueまたはfalseを返すかどうかは開発者によって異なります。

上記を説明するいくつかの例:

  • モデルを編集不可(デフォルトでは任意のモデル)にしたい場合は、常にfalseを返します。

  • 一部のアイテムのみを編集可能にするかどうかを指定する場合は、アイテムに応じてtrueまたはfalseを返します。

  • 新しい値が特定の制限を満たすようにしたい場合。実用的な例としては、編集するアイテムが年齢である必要がある場合、負の値の場合はfalseを返し、その他の場合はtrueを返す必要があります。

1 Steve Oct 01 2020 at 04:33

このメソッドは抽象クラスにあり、オーバーライドできます。上書きされた場合、その新しい実装で何かが起こる可能性がありますよね?

基本クラスの実装はfalseを返します。この関数とdata()は、編集可能なモデル用に再実装する必要があります。

したがって、オーバーライドされる可能性があるだけでなく、場合によっては必要になることもあります。「成功」とは、オーバーライドするメソッドの実装者次第であり、trueまたはのいずれかを返すことができますfalse。