QAbstractItemModel Class

QAbstractItemModel クラスは、アイテムモデルクラスの抽象インターフェースを提供します。詳細...

Header: #include <QAbstractItemModel>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
Inherits: QObject
Inherited By:

QAbstractItemModelReplica, QAbstractListModel, QAbstractProxyModel, QAbstractTableModel, QConcatenateTablesProxyModel, QFileSystemModel, QHelpContentModel, QPdfBookmarkModel, and QStandardItemModel

パブリック型

enum class CheckIndexOption { NoOption, IndexIsValid, DoNotUseParent, ParentIsInvalid }
flags CheckIndexOptions
enum LayoutChangeHint { NoLayoutChangeHint, VerticalSortHint, HorizontalSortHint }

パブリック関数

QAbstractItemModel(QObject *parent = nullptr)
virtual ~QAbstractItemModel()
virtual QModelIndex buddy(const QModelIndex &index) const
virtual bool canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) const
virtual bool canFetchMore(const QModelIndex &parent) const
bool checkIndex(const QModelIndex &index, QAbstractItemModel::CheckIndexOptions options = CheckIndexOption::NoOption) const
(since 6.0) virtual bool clearItemData(const QModelIndex &index)
virtual int columnCount(const QModelIndex &parent = QModelIndex()) const = 0
virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const = 0
virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)
virtual void fetchMore(const QModelIndex &parent)
virtual Qt::ItemFlags flags(const QModelIndex &index) const
virtual bool hasChildren(const QModelIndex &parent = QModelIndex()) const
bool hasIndex(int row, int column, const QModelIndex &parent = QModelIndex()) const
virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const
virtual QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const = 0
bool insertColumn(int column, const QModelIndex &parent = QModelIndex())
virtual bool insertColumns(int column, int count, const QModelIndex &parent = QModelIndex())
bool insertRow(int row, const QModelIndex &parent = QModelIndex())
virtual bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex())
virtual QMap<int, QVariant> itemData(const QModelIndex &index) const
virtual QModelIndexList match(const QModelIndex &start, int role, const QVariant &value, int hits = 1, Qt::MatchFlags flags = Qt::MatchFlags(Qt::MatchStartsWith|Qt::MatchWrap)) const
virtual QMimeData *mimeData(const QModelIndexList &indexes) const
virtual QStringList mimeTypes() const
bool moveColumn(const QModelIndex &sourceParent, int sourceColumn, const QModelIndex &destinationParent, int destinationChild)
virtual bool moveColumns(const QModelIndex &sourceParent, int sourceColumn, int count, const QModelIndex &destinationParent, int destinationChild)
bool moveRow(const QModelIndex &sourceParent, int sourceRow, const QModelIndex &destinationParent, int destinationChild)
virtual bool moveRows(const QModelIndex &sourceParent, int sourceRow, int count, const QModelIndex &destinationParent, int destinationChild)
(since 6.0) virtual void multiData(const QModelIndex &index, QModelRoleDataSpan roleDataSpan) const
virtual QModelIndex parent(const QModelIndex &index) const = 0
bool removeColumn(int column, const QModelIndex &parent = QModelIndex())
virtual bool removeColumns(int column, int count, const QModelIndex &parent = QModelIndex())
bool removeRow(int row, const QModelIndex &parent = QModelIndex())
virtual bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex())
virtual QHash<int, QByteArray> roleNames() const
virtual int rowCount(const QModelIndex &parent = QModelIndex()) const = 0
virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)
virtual bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole)
virtual bool setItemData(const QModelIndex &index, const QMap<int, QVariant> &roles)
virtual QModelIndex sibling(int row, int column, const QModelIndex &index) const
virtual void sort(int column, Qt::SortOrder order = Qt::AscendingOrder)
virtual QSize span(const QModelIndex &index) const
virtual Qt::DropActions supportedDragActions() const
virtual Qt::DropActions supportedDropActions() const

パブリック・スロット

virtual void revert()
virtual bool submit()

シグナル

void columnsAboutToBeInserted(const QModelIndex &parent, int first, int last)
void columnsAboutToBeMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationColumn)
void columnsAboutToBeRemoved(const QModelIndex &parent, int first, int last)
void columnsInserted(const QModelIndex &parent, int first, int last)
void columnsMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationColumn)
void columnsRemoved(const QModelIndex &parent, int first, int last)
void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QList<int> &roles = QList<int>())
void headerDataChanged(Qt::Orientation orientation, int first, int last)
void layoutAboutToBeChanged(const QList<QPersistentModelIndex> &parents = QList<QPersistentModelIndex>(), QAbstractItemModel::LayoutChangeHint hint = QAbstractItemModel::NoLayoutChangeHint)
void layoutChanged(const QList<QPersistentModelIndex> &parents = QList<QPersistentModelIndex>(), QAbstractItemModel::LayoutChangeHint hint = QAbstractItemModel::NoLayoutChangeHint)
void modelAboutToBeReset()
void modelReset()
void rowsAboutToBeInserted(const QModelIndex &parent, int start, int end)
void rowsAboutToBeMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationRow)
void rowsAboutToBeRemoved(const QModelIndex &parent, int first, int last)
void rowsInserted(const QModelIndex &parent, int first, int last)
void rowsMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationRow)
void rowsRemoved(const QModelIndex &parent, int first, int last)

保護された関数

void beginInsertColumns(const QModelIndex &parent, int first, int last)
void beginInsertRows(const QModelIndex &parent, int first, int last)
bool beginMoveColumns(const QModelIndex &sourceParent, int sourceFirst, int sourceLast, const QModelIndex &destinationParent, int destinationChild)
bool beginMoveRows(const QModelIndex &sourceParent, int sourceFirst, int sourceLast, const QModelIndex &destinationParent, int destinationChild)
void beginRemoveColumns(const QModelIndex &parent, int first, int last)
void beginRemoveRows(const QModelIndex &parent, int first, int last)
void beginResetModel()
void changePersistentIndex(const QModelIndex &from, const QModelIndex &to)
void changePersistentIndexList(const QModelIndexList &from, const QModelIndexList &to)
QModelIndex createIndex(int row, int column, const void *ptr = nullptr) const
QModelIndex createIndex(int row, int column, quintptr id) const
void endInsertColumns()
void endInsertRows()
void endMoveColumns()
void endMoveRows()
void endRemoveColumns()
void endRemoveRows()
void endResetModel()
QModelIndexList persistentIndexList() const

保護されたスロット

virtual void resetInternalData()

詳細説明

QAbstractItemModel クラスは、アイテムモデルがモデル/ビューアーキテクチャの他のコンポーネントと相互運用するために使用しなければならない標準インターフェースを定義しています。これは、直接インスタンス化されることは想定されていません。代わりに、新しいモデルを作成するためにサブクラスを作成する必要があります。

QAbstractItemModel クラスはモデル/ビュー・クラスの一つで、Qt のモデル/ビュー・フレームワークの一部です。QMLのアイテムビュー要素やQt Widgetsモジュールのアイテムビュークラスの基礎となるデータモデルとして使用することができます。

QML の List View 要素や C++ ウィジェットQListViewQTableView のようなアイテムビューで使用するモデルが必要な場合は、このクラスの代わりにQAbstractListModelQAbstractTableModel をサブクラス化することを検討してください。

基本的なデータモデルはテーブルの階層としてビューやデリゲートに公開されます。階層を利用しない場合、モデルは行と列の単純なテーブルとなります。各項目は、QModelIndex で指定された一意のインデックスを持っています。

モデルを介してアクセスできる全てのデータ項目は、関連するモデルインデックスを持ちます。このモデル・インデックスは、index() 関数を使って取得することができます。各インデックスはsibling() インデックスを持つことができ、子項目はparent() インデックスを持ちます。

各項目には、それに関連付けられたいくつかのデータ要素があり、モデルのdata() 関数にロール (Qt::ItemDataRole を参照) を指定することで、それらを取得することができます。利用可能なすべてのロールのデータは、itemData() 関数を使用して同時に取得することができます。

各ロールのデータは、特定のQt::ItemDataRole を使用して設定されます。個々のロールのデータは、setData() を使用して個別に設定されますが、setItemData() を使用してすべてのロールに設定することもできます。

項目は、flags() (Qt::ItemFlag を参照) を使用して、選択、ドラッグ、その他の操作が可能かどうかを照会できます。

アイテムに子オブジェクトがある場合、hasChildren() は対応するインデックスについてtrue を返します。

モデルには、各階層に対してrowCount() とcolumnCount() があります。行や列の挿入や削除は、insertRows(),insertColumns(),removeRows(),removeColumns() で行うことができます。

モデルは変更を示すシグナルを発します。例えば、dataChanged ()は、モデルによって利用可能になったデータの項目が変更されるたびに発せられます。モデルが提供するヘッダーに変更があると、headerDataChanged ()が発せられます。基礎となるデータの構造が変更された場合、モデルはlayoutChanged() を発行し、新しい構造を考慮して、表示されている項目を再表示するよう、接続されているビューに指示することができます。

モデルを通して利用可能な項目は、match() 関数を使って特定のデータを検索することができます。

モデルをソートするには、sort() を使用します。

サブクラスの作成

: モデルをサブクラス化するための一般的なガイドラインは、「Model Subclassing Reference」にあります。

QAbstractItemModel をサブクラス化する際には、少なくともindex(),parent(),rowCount(),columnCount(),data() を実装する必要があります。これらの関数は、すべての読み取り専用モデルで使用され、編集可能モデルの基礎を形成します。

また、rowCount()の実装が高価なモデルのために、hasChildren()を再実装して特別な動作を提供することもできます。これにより、モデルはビューから要求されるデータ量を制限することができるようになり、モデルデータのレイジーポピュレーションを実装する方法として使用することができます。

モデルの編集を可能にするには、setData ()を実装し、ItemIsEditable が返されるようにflags ()を再実装する必要があります。また、headerData ()とsetHeaderData ()を再実装して、モデルのヘッダーの表示方法を制御することもできます。

setData() およびsetHeaderData() 関数を再実装する場合は、それぞれdataChanged() およびheaderDataChanged() シグナルを明示的に出力する必要があります。

カスタムモデルは、他のコンポーネントが使用するためのモデルインデックスを作成する必要があります。これを行うには、createIndex() を、項目の適切な行番号と列番号、および識別子(ポインタまたは整数値)を指定して呼び出します。これらの値の組み合わせは、各項目で一意でなければなりません。カスタムモデルでは通常、アイテムのデータを取得したり、アイテムの親や子に関する情報にアクセスしたりするために、他の再実装関数でこれらの一意な識別子を使用します。一意な識別子の詳細については、単純なツリーモデルの例を参照してください。

Qt::ItemDataRole で定義されているすべてのロールをサポートする必要はありません。モデル内に含まれるデータの種類によっては、より一般的なロールのいくつかに対して有効な情報を返すためにdata() 関数を実装することだけが有用な場合もあります。ほとんどのモデルは、Qt::DisplayRole に対して少なくとも項目データのテキスト表現を提供し、行儀の良いモデルはQt::ToolTipRoleQt::WhatsThisRole に対しても有効な情報を提供するはずです。これらの役割をサポートすることで、モデルを標準的なQtビューで使用することができます。しかし、高度に専門化されたデータを扱うモデルによっては、ユーザー定義のロールにのみデータを提供することが適切な場合もあります。

リサイズ可能なデータ構造へのインタフェースを提供するモデルは、insertRows ()、removeRows ()、insertColumns ()、removeColumns ()の実装を提供することができます。これらの関数を実装する場合、モデルのディメンジョンに変更が発生する前と 後の両方で、接続されているビューに 変更を通知することが重要です:

これらの関数が発するプライベート・シグナルは、どのデータも利用できなくなる前に、接続されたコンポーネントがアクションを起こす機会を与える。これらのbegin関数とend関数で挿入と削除の操作をカプセル化することで、モデルがpersistent model indexes選択項目を適切に処理したい場合は、これらの関数を確実に呼び出す必要があります。子アイテムを持つアイテムを挿入または削除する場合、子アイテムに対してこれらの関数を呼び出す必要はありません。つまり、親アイテムが子アイテムの処理を行います。

インクリメンタルに入力するモデルを作成するには、fetchMore() とcanFetchMore() を再実装します。fetchMore() を再実装してモデルに行を追加する場合は、beginInsertRows() とendInsertRows() を呼び出す必要があります。

スレッドの安全性

QObject のサブクラスである QAbstractItemModel はthread-safe ではありません。QAbstractItemModel のモデル関連の API は、モデルオブジェクトが存在するスレッドからのみ呼び出される必要があります。QAbstractItemModel がビューと接続されている場合、それは GUI スレッドを意味します。バックグラウンドスレッドを使用してモデルの内容を入力したり変更したりすることは可能ですが、バックグラウンドスレッドはモデル関連の API を直接呼び出すことができないため、注意が必要です。その代わりに、更新をキューに入れ、メインスレッドで適用する必要があります。これはキュー接続で行うことができます。

モデルクラス,モデルサブクラスリファレンス,QModelIndex,QAbstractItemView,アイテムビューでのドラッグ&ドロップの使用,シンプルなツリーモデルの例,編集可能なツリーモデルの例,Fetch Moreの例も参照してください

メンバ型のドキュメント

enum class QAbstractItemModel::CheckIndexOption
flags QAbstractItemModel::CheckIndexOptions

この enum は、QAbstractItemModel::checkIndex() によって実行されるチェックを制御するために使用することができます。

定数説明
QAbstractItemModel::CheckIndexOption::NoOption0x0000チェックオプションは指定されません。
QAbstractItemModel::CheckIndexOption::IndexIsValid0x0001QAbstractItemModel::checkIndex() に渡されたモデル・インデックスが有効なモデル・インデックスであるかどうかがチェックされます。
QAbstractItemModel::CheckIndexOption::DoNotUseParent0x0002QAbstractItemModel::checkIndex() に渡されたインデックスの親の使用に関するチェックを行いません。
QAbstractItemModel::CheckIndexOption::ParentIsInvalid0x0004QAbstractItemModel::checkIndex() に渡されたモデル・インデックスの親が無効なモデル・インデックスであることをチェックする。このオプションと DoNotUseParent の両方が指定されている場合、このオプションは無視されます。

CheckIndexOptions 型は、QFlags<CheckIndexOption> の typedef です。CheckIndexOption 値の OR の組み合わせを格納する。

enum QAbstractItemModel::LayoutChangeHint

この列挙型は、モデルがレイアウトを変更する方法を記述する。

定数説明
QAbstractItemModel::NoLayoutChangeHint0ヒントはありません。
QAbstractItemModel::VerticalSortHint1行はソートされています。
QAbstractItemModel::HorizontalSortHint2列はソートされています。

VerticalSortHintとHorizontalSortHintは、アイテムが同じ親内で移動しており、モデル内の別の親に移動しておらず、フィルタリングされていないことを意味することに注意してください。

メンバ関数のドキュメント

[explicit] QAbstractItemModel::QAbstractItemModel(QObject *parent = nullptr)

与えられたparent で抽象アイテムモデルを構築する。

[virtual noexcept] QAbstractItemModel::~QAbstractItemModel()

抽象項目モデルを破棄します。

[protected] void QAbstractItemModel::beginInsertColumns(const QModelIndex &parent, int first, int last)

列挿入操作を開始します。

サブクラスでinsertColumns() を再実装する場合、モデルの基礎となるデータストアにデータを挿入する前に、この関数を呼び出す必要があります。

parent インデックスは、新しい列が挿入される親に対応します。firstlast は、新しい列が挿入された後の列番号です。

カラムの挿入モデル内の項目に挿入したい列のスパンの最初と最後の列番号を指定します。

例えば、図のように、4列目の前に3列挿入するので、first は4、last は6となります:

beginInsertColumns(parent, 4, 6);

これにより、3つの新しいカラムがカラム4、5、6として挿入されます。

列の追加カラムを追加するには、最後のカラムの後に挿入する。

例えば、図に示すように、既存の6列のコレクション(5列で終わる)に3列を追加するので、first は6、last は8となる:

beginInsertColumns(parent, 6, 8);

これにより、2つの新しいカラムがカラム6、7、8として追加されます。

注意: この関数はcolumnsAboutToBeInserted() シグナルを発行します。このシグナルは、データが挿入される前に接続されたビュー(またはプロキシ)が処理しなければなりません。さもないと、ビューが無効な状態になってしまうかもしれません。

endInsertColumns()も参照

[protected] void QAbstractItemModel::beginInsertRows(const QModelIndex &parent, int first, int last)

行挿入操作を開始します。

サブクラスでinsertRows() を再実装する場合は、モデルの基礎となるデータストアにデータを挿入する前に、この関数を呼び出す必要があります。

parent インデックスは、新しい行が挿入される親に対応します。firstlast は、新しい行が挿入された後の行番号です。

行の挿入モデル内の項目に挿入したい行のスパンの最初と最後の行番号を指定します。

たとえば、図のように、2行目の前に3行挿入するので、first は 2、last は 4 となります:

beginInsertRows(parent, 2, 4);

これにより、3つの新しい行が2行目、3行目、4行目として挿入されます。

行の追加行を追加するには、最後の行の後に行を挿入する。

例えば、図のように、既存の4行のコレクション(3行目で終了)に2行を追加するので、first は4、last は5となる:

beginInsertRows(parent, 4, 5);

これにより、2つの新しい行が4行目と5行目として追加される。

注意: この関数はrowsAboutToBeInserted() シグナルを発行します。このシグナルは、接続されたビュー (またはプロキシ) がデータを挿入する前に処理しなければなりません。そうしないと、ビューが無効な状態になってしまう可能性があります。

endInsertRows()も参照

[protected] bool QAbstractItemModel::beginMoveColumns(const QModelIndex &sourceParent, int sourceFirst, int sourceLast, const QModelIndex &destinationParent, int destinationChild)

列の移動操作を開始します。

サブクラスを再実装する場合、このメソッドは、モデル内のエンティティの移動を単純化します。このメソッドは、モデル内の永続インデックスの移動を担当します。beginMoveColumns とendMoveColumns を使用すると、layoutAboutToBeChangedlayoutChangedchangePersistentIndex と共に直接発行する代わりになります。

sourceParent インデックスは、列の移動元の親に対応します。sourceFirstsourceLast は、移動する列の最初と最後の列番号です。destinationParent インデックスは、それらの列が移動される親に対応する。destinationChild はカラムの移動先のカラムである。つまり、sourceParent のカラムsourceFirst のインデックスは、destinationParent のカラムdestinationChild となり、それに続いてsourceLast までのすべてのカラムが移動する。

しかし、同じ親(sourceParentdestinationParent が等しい)のカラムを下に移動させる場合、カラムはdestinationChild インデックスの前に配置されます。つまり、カラム0と1を移動してカラム1と2にしたい場合、destinationChild は3でなければなりません。この場合、ソース・カラムの新しいインデックスisourceFirstsourceLast の間にある)は(destinationChild-sourceLast-1+i) に等しくなります。

sourceParentdestinationParent が同じ場合、destinationChildsourceFirstsourceLast + 1 の範囲内にないことを確認する必要があることに注意してください。また、列を自分の子や先祖のいずれかに移動させようとしないようにしなければなりません。このメソッドは、どちらかの条件が真であればfalse を返します。この場合は、移動操作を中止してください。

endMoveColumns()も参照

[protected] bool QAbstractItemModel::beginMoveRows(const QModelIndex &sourceParent, int sourceFirst, int sourceLast, const QModelIndex &destinationParent, int destinationChild)

行の移動操作を開始します。

サブクラスを再実装する場合、このメソッドは、モデル内のエンティティの移動を単純化します。このメソッドは、モデル内の永続インデックスの移動を担当します。beginMoveRows とendMoveRows を使用することは、layoutAboutToBeChangedlayoutChangedchangePersistentIndex と共に直接発行することの代替方法です。

sourceParent インデックスは、行の移動元の親に対応します。sourceFirstsourceLast は、移動する行の最初と最後の行番号です。destinationParent インデックスは、それらの行が移動される親に対応する。destinationChild は、行の移動先の行である。つまり、sourceParent の行sourceFirst のインデックスは、destinationParent の行destinationChild になり、その後に、sourceLast までの行が続く。

しかし、同じ親(sourceParentdestinationParent が等しい)の中で行を下に移動する場合、行はdestinationChild インデックスの前に置かれる。つまり、0行目と1行目を移動して1行目と2行目にしたい場合、destinationChild は3でなければならない。この場合、ソース行isourceFirstsourceLast の間にある)の新しいインデックスは、(destinationChild-sourceLast-1+i) に等しくなります。

sourceParentdestinationParent が同じ場合、destinationChildsourceFirstsourceLast + 1 の範囲内にないことを確認する必要があります。また、行を自分の子や先祖のいずれかに移動させようとしないようにしなければなりません。このメソッドは、いずれかの条件が真であればfalse を返します。

行を別の親に移動するモデル内で移動させたい移動元の親の行のスパンの最初と最後の行番号を指定します。また、スパンを移動する移動先の親の行も指定します。

たとえば、図のように、移動元で 2 行目から 4 行目までの 3 行を移動するので、sourceFirst は 2、sourceLast は 4 となります。移動先でこれらの項目を 2 行目より上に移動するので、destinationChild は 2 となります。

beginMoveRows(sourceParent, 2, 4, destinationParent, 2);

これにより、移動元では2行目、3行目、4行目の3行が移動先では2行目、3行目、4行目となる。影響を受ける他の兄弟は、それに応じて移動される。

別の親に追加する行の移動行を別の親に追加するには、最後の行の後に移動させます。

例えば、図に示すように、3行を6行の既存の行の集合(5行目で終わる)に移動させるので、destinationChild は6となる:

beginMoveRows(sourceParent, 2, 4, destinationParent, 6);

これにより、対象の行は6、7、8として対象の親の最後に移動します。

同じ親内の行を上に移動同じ親内の行を移動するには、移動先の行を指定します。

例えば図のように、2行目から0行目へ1つ移動させるので、sourceFirstsourceLast は2、destinationChild は0となる。

beginMoveRows(parent, 2, 2, parent, 0);

それに応じて他の行も移動する可能性があることに注意。また、同じ親の中で項目を移動する場合、無効な移動やノーオペの移動を試みてはならないことに注意。上の例では、アイテム2は移動前は2行目にあるため、2行目(すでにある行)や3行目(3行目はすでにある3行目の上という意味で無効)には移動できない。

同じ親内の行を下に移動する同じ親の中にある行を移動するには、移動先の行を指定します。

例えば、図のように、2行目から4行目へ1つ移動させるので、sourceFirstsourceLast は2、destinationChild は4となる。

beginMoveRows(parent, 2, 2, parent, 4);

それに応じて他の行も移動する可能性があることに注意してください。

endMoveRows()も参照のこと

[protected] void QAbstractItemModel::beginRemoveColumns(const QModelIndex &parent, int first, int last)

列の削除操作を開始します。

サブクラスでremoveColumns() を再実装する場合、モデルの基礎となるデータストアからデータを削除する前に、この関数を呼び出す必要があります。

parent インデックスは、新しい列が削除される親に対応します。firstlast は、削除される最初と最後の列の列番号です。

カラムの削除モデル内の項目から削除したい列のスパンの最初と最後の列番号を指定します。

たとえば、図のように、4列目から6列目までの3列を削除するので、first は 4、last は 6 となります:

beginRemoveColumns(parent, 4, 6);

注: この関数は、columnsAboutToBeRemoved() シグナルを発行します。このシグナルは、データが削除される前に、接続されたビュー(またはプロキシ)が処理しなければなりません。さもなければ、ビューは無効な状態になるかもしれません。

endRemoveColumns()も参照してください

[protected] void QAbstractItemModel::beginRemoveRows(const QModelIndex &parent, int first, int last)

行削除処理を開始します。

サブクラスでremoveRows() を再実装する場合、モデルの基礎となるデータストアからデータを削除する前に、この関数を呼び出す必要があります。

parent インデックスは、新しい行が削除される親に対応します。firstlast は、削除される行の行番号です。

行の削除モデル内の項目から削除したい行のスパンの最初と最後の行番号を指定します。

たとえば、図のように、2行目から3行目までの2行を削除するので、first は 2、last は 3 となります:

beginRemoveRows(parent, 2, 3);

注意: この関数はrowsAboutToBeRemoved() シグナルを発行します。このシグナルは、接続されたビュー(またはプロキシ)がデータを削除する前に処理する必要があります。さもなければ、ビューは無効な状態になってしまうかもしれません。

endRemoveRows()も参照してください

[protected] void QAbstractItemModel::beginResetModel()

モデルのリセット操作を開始します。

リセット操作は、接続されているビューのモデルを現在の状態にリセットします。

注意: このモデルにアタッチされているビューも同様にリセットされます。

モデルがリセットされるということは、モデルから報告された以前のデータは無効となり、再度問い合わせを行う必要があるということです。これは、現在の項目と選択された項目が無効になることも意味します。

モデルがそのデータを根本的に変更するとき、基礎となるデータソースやその構造が変更されたときに他のコンポーネントに通知するためにdataChanged() を呼び出すよりも、この関数を呼び出す方が簡単な場合があります。

モデルやプロキシモデルの内部データ構造をリセットする前に、この関数を呼び出す必要があります。

この関数は、シグナルmodelAboutToBeReset() を発行します。

modelAboutToBeReset(),modelReset(),endResetModel()も参照してください

[virtual] QModelIndex QAbstractItemModel::buddy(const QModelIndex &index) const

index で表される項目のバディのモデル・インデックスを返します。ユーザがアイテムを編集したい場合、ビューはこの関数を呼び出して、モデル内の別のアイテムが代わりに編集されるべきかどうかをチェックします。そして、ビューは、バディアイテムによって返されたモデルインデックスを使用してデリゲートを構築します。

この関数のデフォルトの実装では、各項目はそれ自身のバディとなります。

[virtual] bool QAbstractItemModel::canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) const

モデルがdata のドロップを受け入れることができる場合、true を返します。 このデフォルトの実装では、datamimeTypes() のリストに少なくとも1つの書式があるかどうか、そしてaction がモデルのsupportedDropActions() の中にあるかどうかだけをチェックします。

rowcolumnparentactiondata を削除できるかどうかをテストしたい場合は、カスタムモデルでこの関数を再実装してください。 このテストが必要ない場合は、この関数を再実装する必要はありません。

dropMimeData() およびUsing drag and drop with item viewsも参照してください

[virtual invokable] bool QAbstractItemModel::canFetchMore(const QModelIndex &parent) const

利用可能なデータがparent より多い場合はtrue を返し、そうでない場合はfalse を返します。

デフォルトの実装では、常にfalse を返します。

canFetchMore() がtrue を返す場合は、fetchMore() 関数を呼び出す必要があります。これは、例えばQAbstractItemView の動作です。

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

fetchMore()も参照してください

[protected] void QAbstractItemModel::changePersistentIndex(const QModelIndex &from, const QModelIndex &to)

与えられたfrom モデル・インデックスに等しいQPersistentModelIndex を、与えられたto モデル・インデックスに変更します。

与えられたfrom モデルインデックスに等しい永続的なモデルインデックスが見つからなかった場合、何も変更されません。

persistentIndexList() およびchangePersistentIndexList()も参照して ください。

[protected] void QAbstractItemModel::changePersistentIndexList(const QModelIndexList &from, const QModelIndexList &to)

与えられたfrom モデル・インデックス・リストのインデックスに等しい {QPersistentModelIndex} を、与えられたto モデル・インデックス・リストに変更します。

与えられたfrom モデル・インデックス・リストのインデックスに等しい永続モデル・インデックスが見つからない場合、何も変更されません。

persistentIndexList() およびchangePersistentIndex()も参照のこと

bool QAbstractItemModel::checkIndex(const QModelIndex &index, QAbstractItemModel::CheckIndexOptions options = CheckIndexOption::NoOption) const

この関数は、index がこのモデルに対する正当なモデル・インデックスであるかどうかを調べます。正当なモデルインデックスとは、無効なモデルインデックスか、以下の全てが成り立つ有効なモデルインデックスのことです:

  • インデックスのモデルがthis である;
  • index'の行が0以上である;
  • インデックスの行がインデックスの親の行数より小さい;
  • インデックスの列がゼロより大きいか等しい;
  • index'の列がindex'の親の列数より小さい。

options 引数は、これらのチェックの一部を変更する可能性がある。optionsIndexIsValid が含まれている場合、index は有効なインデックスでなければならない。これは、有効なインデックスを期待するdata() やsetData() などの関数を再実装するときに便利である。

optionsDoNotUseParent が含まれている場合、parent()を呼び出すためのチェックは省略される。これにより、parent()の再実装からこの関数を呼び出すことができる(そうでない場合、無限の再帰とクラッシュが発生する)。

optionsDoNotUseParent を含まず、ParentIsInvalid を含む場合、追加のチェックが行われる: 親インデックスが有効でないかどうかがチェックされる。これは、リストやテーブルのような平坦なモデルを実装するときに便利です。

この関数は、すべてのチェックが成功した場合は真を返し、そうでない場合は偽を返します。これにより、この関数をQ_ASSERT や他の類似のデバッグメカニズムで使用することができます。チェックに失敗した場合、qt.core.qabstractitemmodel.checkindex のロギングカテゴリに、失敗のデバッグに役立つ情報を含む警告メッセージが出力されます。

注: この関数は、独自のアイテムモデルを実装するためのデバッグヘルパーです。複雑なモデルを開発するときや、複雑なモデル階層を構築するとき(例えばプロキシモデルを使用するとき)、誤ってQAbstractItemModel API に渡された不正なモデルインデックス(上記で定義)に関連するバグを発見するために、この関数を呼び出すことは有用です。

警告 アイテムモデルに不正なインデックスを渡すことは未定義の振る舞いであるため、アプリケーションはそうすることを控えなければなりません。また、アイテムモデルが不正なインデックスを潔く処理するための「防御的」プログラミングに依存してはいけません。

QModelIndexも参照してください

[virtual, since 6.0] bool QAbstractItemModel::clearItemData(const QModelIndex &index)

与えられたindex のすべてのロールに格納されているデータを削除します。成功した場合はtrue を返し、失敗した場合はfalse を返します。データの削除に成功した場合はdataChanged() シグナルが発行されるはずです。基底クラスの実装はfalse

この関数は Qt 6.0 で導入されました。

data(),itemData(),setData(),setItemData()も参照してください

[pure virtual invokable] int QAbstractItemModel::columnCount(const QModelIndex &parent = QModelIndex()) const

与えられたparent の子の列数を返します。

ほとんどのサブクラスでは、列数はparent に依存しません。

例えば

int MyModel::columnCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent);
    return 3;
}

注意 : テーブルベースのモデルを実装する場合、親が有効であれば columnCount() は 0 を返すべきです。

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

rowCount()も参照してください

[private signal] void QAbstractItemModel::columnsAboutToBeInserted(const QModelIndex &parent, int first, int last)

このシグナルはカラムがモデルに挿入される直前に発せられます。新しい項目は、firstlast の間、与えられたparent 項目の下に配置されます。

注意: このシグナルに接続されたコンポーネントは、モデルの寸法の変更に適応するためにこのシグナルを使用します。このシグナルはQAbstractItemModel の実装によってのみ発することができ、サブクラスのコードで明示的に発することはできません。

注意: これはプライベートシグナルです。シグナル接続で使用することはできますが、ユーザーが発することはできません。

insertColumns() およびbeginInsertColumns()も参照してください

[private signal] void QAbstractItemModel::columnsAboutToBeMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationColumn)

このシグナルは、モデル内で列が移動される直前に発せられます。移動される項目は、指定されたsourceParent 項目の下にある、sourceStart からsourceEnd までの項目です。それらは、destinationColumn の列から始まるdestinationParent に移動されます。

注意:このシグナルに接続されたコンポーネントは、モデルの寸法の変更に適応するためにこのシグナルを使用します。このシグナルはQAbstractItemModel の実装によってのみ発することができ、サブクラスのコードで明示的に発することはできません。

注意: これはプライベートシグナルです。シグナル接続で使用することはできますが、ユーザーが発することはできません。

beginMoveRows()も参照

[private signal] void QAbstractItemModel::columnsAboutToBeRemoved(const QModelIndex &parent, int first, int last)

このシグナルは列がモデルから削除される直前に発せられます。削除される項目は、指定されたparent 項目の下にある、first からlast までの項目です。

注意: このシグナルに接続されたコンポーネントは、モデルの次元の変更に適応するためにこのシグナルを使用します。このシグナルはQAbstractItemModel の実装によってのみ発することができ、サブクラスのコードで明示的に発することはできません。

注意: これはプライベートシグナルです。シグナル接続で使用することはできますが、ユーザーが発することはできません。

removeColumns() およびbeginRemoveColumns()も参照してください

[private signal] void QAbstractItemModel::columnsInserted(const QModelIndex &parent, int first, int last)

このシグナルは、カラムがモデルに挿入された後に発行されます。新しい項目とは、first からlast までの項目で、指定されたparent 項目の下にあるものです。

注意: このシグナルに接続されたコンポーネントは、モデルの寸法の変更に適応するためにこのシグナルを使用します。このシグナルはQAbstractItemModel の実装によってのみ発することができ、サブクラスのコードで明示的に発することはできません。

注意: これはプライベートシグナルです。シグナル接続で使用することはできますが、ユーザーが発することはできません。

insertColumns() およびbeginInsertColumns()も参照してください

[private signal] void QAbstractItemModel::columnsMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationColumn)

このシグナルは、モデル内でカラムが移動された後に発せられます。指定されたsourceParent 項目の下にある、sourceStart からsourceEnd までの項目が、destinationColumn 列から始まるdestinationParent に移動されました。

注意:このシグナルに接続されたコンポーネントは、モデルの寸法の変更に適応するためにこのシグナルを使用します。このシグナルはQAbstractItemModel 実装によってのみ発することができ、サブクラスのコードで明示的に発することはできません。

注意: これはプライベートシグナルです。シグナル接続で使用することはできますが、ユーザーが発することはできません。

beginMoveRows()も参照してください

[private signal] void QAbstractItemModel::columnsRemoved(const QModelIndex &parent, int first, int last)

このシグナルは、モデルからカラムが削除された後に発行されます。削除される項目は、指定されたparent 項目の下にある、first からlast までの項目です。

注意: このシグナルに接続されたコンポーネントは、モデルの寸法の変更に適応するためにこのシグナルを使用します。このシグナルはQAbstractItemModel の実装によってのみ発することができ、サブクラスのコードで明示的に発することはできません。

注意: これはプライベートシグナルです。シグナル接続で使用することはできますが、ユーザーが発することはできません。

removeColumns() およびbeginRemoveColumns()も参照してください

[protected] QModelIndex QAbstractItemModel::createIndex(int row, int column, const void *ptr = nullptr) const

内部ポインタptr を使用して、与えられたrowcolumn のモデル・インデックスを作成します。

QSortFilterProxyModel を使用する場合、そのインデックスはそれ自身の内部ポインタを持ちます。モデルの外部でこの内部ポインタにアクセスすることはお勧めしません。代わりにdata() 関数を使用してください。

この関数は、モデルのサブクラスがモデル・インデックスを作成するために使用しなければならない一貫したインタフェースを提供します。

[protected] QModelIndex QAbstractItemModel::createIndex(int row, int column, quintptr id) const

与えられたrowcolumn に対して、内部識別子id を持つモデル・インデックスを作成します。

この関数は、モデルのサブクラスがモデルインデックスを作成するために使用しなければならない一貫したインタフェースを提供します。

QModelIndex::internalId()も参照してください

[pure virtual invokable] QVariant QAbstractItemModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const

index によって参照される項目について、指定されたrole の下に格納されているデータを返します。

注釈 返す値がない場合は、無効な(デフォルトで構成された)QVariant を返します。

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

Qt::ItemDataRolesetData()、headerData()も参照して ください。

[signal] void QAbstractItemModel::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QList<int> &roles = QList<int>())

このシグナルは既存のアイテムのデータが変更されるたびに発せられる。

アイテムが同じ親を持つ場合、影響を受けるのはtopLeft からbottomRight までのアイテムです。アイテムが同じ親を持たない場合、動作は未定義です。

setData() 関数を再実装する場合、このシグナルを明示的に発する必要がある。

オプションの引数roles を使用すると、実際に変更されたデータ・ロールを指定できます。roles引数に空のベクトルを指定すると、すべてのロールが変更されたと見なされます。roles引数の要素の順番は関係ありません。

headerDataChanged ()、setData ()、layoutChanged()も参照して ください。

[virtual] bool QAbstractItemModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)

与えられたaction で終了したドラッグ&ドロップ操作によって提供されたdata を処理します。

データとアクションがモデルによって処理された場合はtrue を返し、そうでない場合はfalse を返します。

指定されたrowcolumnparent は、操作が終了したモデル内のアイテムの位置を示します。正しい場所でアクションを完了させるのはモデルの責任です。

例えば、QTreeView のアイテムにドロップ・アクションを実行すると、rowcolumnparent で指定されたアイテムの子として、またはアイテムの兄弟として、新しいアイテムが挿入される。

rowcolumn が -1 の場合、ドロップされたデータはparent に直接ドロップされたものとみなされます。通常、これはデータをparent の子アイテムとして追加することを意味します。rowcolumn が 0 以上の場合、ドロップは指定されたparent の指定されたrowcolumn の直前に発生したことを意味します。

mimeTypes() メンバは、許容可能な MIME タイプのリストを取得するために呼び出される。このデフォルトの実装では、デフォルトの MIME タイプを 1 つ返すmimeTypes() を想定している。カスタム・モデルでmimeTypes() を再実装して複数の MIME タイプを返すようにする場合、それらを利用するためにこの関数を再実装する必要があります。

supportedDropActions ()、canDropMimeData ()、および項目ビューでのドラッグ・アンド・ドロップの使用も参照して ください。

[protected] void QAbstractItemModel::endInsertColumns()

列の挿入操作を終了します。

サブクラスでinsertColumns() を再実装する場合は、モデルの基礎となるデータ・ストアにデータを挿入した後に、この関数を呼び出す必要があります。

beginInsertColumns()も参照してください

[protected] void QAbstractItemModel::endInsertRows()

行挿入操作を終了します。

サブクラスでinsertRows() を再実装する場合は、モデルの基礎となるデータ・ストアにデータを挿入した後に、この関数を呼び出す必要があります。

beginInsertRows()も参照してください

[protected] void QAbstractItemModel::endMoveColumns()

列移動操作を終了します。

サブクラスを実装する場合は、モデルの基礎となるデータストア内でデータを移動した後に、この関数を呼び出す必要があります。

beginMoveColumns() も参照して ください。

[protected] void QAbstractItemModel::endMoveRows()

行移動操作の終了。

サブクラスを実装する場合は、モデルの基礎となるデータストア内でデータを移動した後に、この関数を呼び出す必要があります。

beginMoveRows() も参照して ください。

[protected] void QAbstractItemModel::endRemoveColumns()

列削除処理を終了します。

サブクラスでremoveColumns() を再実装する場合は、モデルの基礎となるデータ・ストアからデータを削除した後に、この関数を呼び出す必要があります。

beginRemoveColumns()も参照してください

[protected] void QAbstractItemModel::endRemoveRows()

行削除処理を終了します。

サブクラスでremoveRows() を再実装する場合は、モデルの基礎となるデータ・ストアからデータを削除した後に、この関数を呼び出す必要があります。

beginRemoveRows()も参照してください

[protected] void QAbstractItemModel::endResetModel()

モデル・リセット操作の完了。

モデルまたはプロキシ・モデルの内部データ構造をリセットした後に、この関数を呼び出す必要があります。

この関数はシグナルmodelReset() を出力します。

beginResetModel()も参照してください

[virtual invokable] void QAbstractItemModel::fetchMore(const QModelIndex &parent)

parent インデックスで指定された親を持つアイテムの利用可能なデータを取得します。

モデルをインクリメンタルに更新する場合は、この関数を再実装してください。

デフォルトの実装は何もしません。

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

canFetchMore()も参照してください

[virtual invokable] Qt::ItemFlags QAbstractItemModel::flags(const QModelIndex &index) const

与えられたindex の項目フラグを返します。

基本クラスの実装では、アイテムを有効にし (ItemIsEnabled)、選択できるようにする (ItemIsSelectable)フラグの組み合わせを返します。

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

Qt::ItemFlagsも参照して ください。

[virtual invokable] bool QAbstractItemModel::hasChildren(const QModelIndex &parent = QModelIndex()) const

parent に子オブジェクトがあればtrue を返し、なければfalse を返します。

子の数を調べるには親オブジェクトにrowCount() を使ってください。

同じインデックスにフラグQt::ItemNeverHasChildren が設定されている場合に、このメソッドで特定のインデックスに hasChildren があると報告するのは未定義の動作であることに注意してください。

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

parent() およびindex()も参照してください

[invokable] bool QAbstractItemModel::hasIndex(int row, int column, const QModelIndex &parent = QModelIndex()) const

モデルがrowcolumn に対して有効なQModelIndex を返した場合はtrue を、parent を返した場合はfalse を返します。

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

[virtual invokable] QVariant QAbstractItemModel::headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const

指定されたorientation のヘッダ内の、指定されたrolesection のデータを返します。

水平ヘッダーの場合、セクション番号は列番号に対応します。同様に、縦書きヘッダーの場合、セクション番号は行番号に対応する。

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

Qt::ItemDataRolesetHeaderData()、QHeaderViewも参照

[signal] void QAbstractItemModel::headerDataChanged(Qt::Orientation orientation, int first, int last)

このシグナルはヘッダーが変更されるたびに発せられます。orientation は水平ヘッダが変更されたか垂直ヘッダが変更されたかを示す。ヘッダー内のfirst からlast までのセクションを更新する必要がある。

setHeaderData()関数を再実装する場合は、このシグナルを明示的に発する必要がある。

列や行の数を変更する場合は、このシグナルを発する必要はなく、begin/end関数を使用します(詳細については、QAbstractItemModel クラス説明のサブクラス化のセクションを参照してください)。

headerData()、setHeaderData()、dataChanged()も参照

[pure virtual invokable] QModelIndex QAbstractItemModel::index(int row, int column, const QModelIndex &parent = QModelIndex()) const

指定されたrowcolumnparent インデックスで指定されたモデル内の項目のインデックスを返します。

サブクラスでこの関数を再実装する場合は、createIndex() を呼び出して、他のコンポーネントがモデル内の項目を参照するために使用できるモデル・インデックスを生成します。

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

createIndex()も参照してください

[invokable] bool QAbstractItemModel::insertColumn(int column, const QModelIndex &parent = QModelIndex())

指定されたparent の子項目において、指定されたcolumn の前に1つの列を挿入します。

カラムが挿入された場合はtrue を返し、そうでない場合はfalse を返します。

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

insertColumns(),insertRow(),removeColumn()も参照してください

[virtual invokable] bool QAbstractItemModel::insertColumns(int column, int count, const QModelIndex &parent = QModelIndex())

これをサポートするモデルでは、与えられたcolumn の前にcount 新しい列をモデルに挿入します。それぞれの新しい列の項目は、parent のモデルインデックスで表される項目の子になります。

column が 0 の場合、列は既存の列の前に追加されます。

columncolumnCount() の場合、列は既存の列に追加されます。

parent に子がない場合、count の列を持つ単一の行が挿入される。

列が正常に挿入された場合はtrue を返し、そうでない場合はfalse を返す。

基底クラスの実装は何もせず、false を返します。

独自のモデルを実装する場合、挿入をサポートしたいのであれば、この関数を再実装することができます。あるいは、データを変更するための独自のAPIを提供することもできます。

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

insertRows(),removeColumns(),beginInsertColumns(),endInsertColumns()参照。

[invokable] bool QAbstractItemModel::insertRow(int row, const QModelIndex &parent = QModelIndex())

指定されたparent の子項目において、指定されたrow の前に一行挿入します。

注意: この関数は、仮想メソッドinsertRows を呼び出します。

行が挿入された場合はtrue を返し、そうでない場合はfalse を返す。

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

insertRows(),insertColumn(),removeRow()も参照して ください。

[virtual invokable] bool QAbstractItemModel::insertRows(int row, int count, const QModelIndex &parent = QModelIndex())

注意: この関数の基底クラスの実装は何もせず、false を返します。

これをサポートするモデルでは、与えられたrow の前にcount の行をモデルに挿入します。新しい行の項目は、parent のモデルインデックスで表される項目の子になります。

row が 0 の場合、行は親の既存の行の前に追加されます。

rowrowCount() の場合、行は親の既存の行に追加されます。

parent に子がない場合、count の行を持つ単一の列が挿入される。

行の挿入に成功した場合はtrue を返し、失敗した場合はfalse を返す。

独自のモデルを実装する場合、挿入をサポートしたいのであればこの関数を再実装することができます。あるいは、データを変更するための独自のAPIを提供することもできます。いずれの場合も、モデルが変更されたことを他のコンポーネントに通知するために、beginInsertRows() とendInsertRows() を呼び出す必要があります。

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

insertColumns()、removeRows()、beginInsertRows()、endInsertRows()も参照して ください。

[virtual] QMap<int, QVariant> QAbstractItemModel::itemData(const QModelIndex &index) const

指定されたindex にあるアイテムのモデル内のすべての定義済みロールの値を持つマップを返します。

この関数のデフォルトの振る舞いを拡張して、カスタムのロールをマップに含めたい場合は、この関数を再実装してください。

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

[signal] void QAbstractItemModel::layoutAboutToBeChanged(const QList<QPersistentModelIndex> &parents = QList<QPersistentModelIndex>(), QAbstractItemModel::LayoutChangeHint hint = QAbstractItemModel::NoLayoutChangeHint)

このシグナルは、モデルのレイアウトが変更される直前に発行されます。このシグナルに接続されたコンポーネントは、モデルのレイアウトの変更に適応するためにこのシグナルを使用します。

サブクラスは、layoutAboutToBeChanged()を発行した後、永続的なモデルのインデックスを更新する必要があります。

オプションのparents パラメータは、モデルのレイアウトのどの部分が変更されたかをより具体的に通知するために使用されます。空のリストは、モデル全体のレイアウトの変更を示します。parents リストの要素の順序は重要ではありません。オプションのhint パラメータは、モデルのリレーアウト中に何が起こっているかについてのヒントを与えるために使用されます。

layoutChanged() およびchangePersistentIndex()も参照の こと。

[signal] void QAbstractItemModel::layoutChanged(const QList<QPersistentModelIndex> &parents = QList<QPersistentModelIndex>(), QAbstractItemModel::LayoutChangeHint hint = QAbstractItemModel::NoLayoutChangeHint)

このシグナルは、モデルによって公開されるアイテムのレイアウトが変更されるたびに発行されます。このシグナルがビューによって受信されると、ビューはこの変更を反映するためにアイテムのレイアウトを更新する必要があります。

QAbstractItemModel またはQAbstractProxyModel をサブクラス化する場合は、アイテムの順序を変更したり、ビューに公開するデータの構造を変更したりする前にlayoutAboutToBeChanged() を発行し、レイアウトを変更した後に layoutChanged() を発行するようにしてください。

オプションのparents パラメータは、モデルのレイアウトのどの部分が変更されるのかをより具体的に通知するために使用されます。空のリストは、モデル全体のレイアウトの変更を示します。parents リストの要素の順序は重要ではありません。オプションのhint パラメータは、モデルのリレーアウト中に何が起こっているかについてのヒントを与えるために使用されます。

サブクラスは、layoutChanged() を発行する前に、永続的なモデルのインデックスを更新する必要があります。言い換えれば、構造が変更されたときに

layoutAboutToBeChanged()、dataChanged()、headerDataChanged()、modelReset()、changePersistentIndex()も参照のこと

[virtual invokable] QModelIndexList QAbstractItemModel::match(const QModelIndex &start, int role, const QVariant &value, int hits = 1, Qt::MatchFlags flags = Qt::MatchFlags(Qt::MatchStartsWith|Qt::MatchWrap)) const

指定されたrole の下に格納されているデータが、指定されたvalue と一致するstart インデックスの列の項目のインデックスのリストを返します。検索の実行方法は、指定されたflags によって定義されます。返されるリストは空でもかまいません。また、例えばプロキシモデルが使用されている場合、リスト内の結果の順序はモデル内の順序と一致しない可能性があることに注意してください。結果の順番は当てになりません。

検索はstart インデックスから開始され、一致するデータ項目の数がhits と等しくなるまで、あるいは検索が最後の行に達するまで、あるいは検索が再びstart に達するまで続けられます -MatchWrapflags で指定されているかどうかによって異なります。 一致するすべての項目を検索したい場合は、hits = -1 を使用します。

デフォルトでは、この関数はすべての項目に対して、value で指定された検索語で始まる項目を検索する、文字列ベースの折り返し比較を実行します。

注意: この関数のデフォルト実装では、列のみを検索します。別の検索動作を含めるには、この関数を再実装してください。

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

[virtual] QMimeData *QAbstractItemModel::mimeData(const QModelIndexList &indexes) const

指定されたindexes のリストに対応するシリアライズされたデータ項目を含むオブジェクトを返します。エンコードされたデータを記述するために使われるフォーマットはmimeTypes() 関数から得られます。このデフォルトの実装では、mimeTypes() のデフォルトの実装が返すデフォルトの MIME タイプを使用します。カスタム・モデルでmimeTypes() を再実装してより多くの MIME タイプを返すようにする場合は、 この関数を再実装してそれらを使用するようにしてください。

indexes のリストが空であるか、サポートされる MIME タイプが存在しない場合、シリアライズされた空のリストではなくnullptr が返されます。

mimeTypes() およびdropMimeData()も参照

[virtual] QStringList QAbstractItemModel::mimeTypes() const

許可されている MIME タイプのリストを返します。デフォルトでは、組み込みモデルとビューは内部 MIME タイプapplication/x-qabstractitemmodeldatalist を使用します。

カスタムモデルでドラッグ&ドロップのサポートを実装する際、デフォルトの内部MIMEタイプ以外の形式でデータを返す場合は、この関数を再実装してMIMEタイプのリストを返します。

カスタムモデルでこの関数を再実装する場合、この関数を呼び出すメンバ関数mimeData() およびdropMimeData() も再実装する必要があります。

mimeData() およびdropMimeData()も参照して ください。

[private signal] void QAbstractItemModel::modelAboutToBeReset()

このシグナルは、モデルの内部状態(永続的なモデルのインデックスなど)が無効化される前にbeginResetModel() が呼び出されたときに発行されます。

注意: これはプライベートシグナルです。シグナル接続で使用することはできますが、ユーザが発行することはできません。

beginResetModel() およびmodelReset()も参照してください

[private signal] void QAbstractItemModel::modelReset()

このシグナルは、モデルの内部状態(永続的なモデル・インデックスなど)が無効化された後、endResetModel ()が呼び出されたときに発行されます。

モデルがリセットされた場合、そのモデルから以前に取得された情報はすべて無効であると考えるべきであることに注意してください。これには、rowCount ()、columnCount ()、flags ()、data ()、roleNames ()で取得されたデータが含まれますが、これらに限定されません。

注: これはプライベート・シグナルである。シグナル接続で使用することはできますが、ユーザーから発信することはできません。

endResetModel() およびmodelAboutToBeReset()も参照

[invokable] bool QAbstractItemModel::moveColumn(const QModelIndex &sourceParent, int sourceColumn, const QModelIndex &destinationParent, int destinationChild)

これをサポートするモデルでは、sourceColumnsourceParent からdestinationParent の下のdestinationChild に移動する。

列の移動に成功した場合はtrue を返し、そうでない場合はfalse を返す。

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

moveColumns() およびmoveRow()も参照して ください。

[virtual invokable] bool QAbstractItemModel::moveColumns(const QModelIndex &sourceParent, int sourceColumn, int count, const QModelIndex &destinationParent, int destinationChild)

これをサポートするモデルでは、与えられたsourceColumn で始まるcount のカラムを親sourceParent の下のカラムdestinationChild の下のカラムdestinationParent に移動します。

カラムの移動に成功した場合はtrue を返し、失敗した場合はfalse を返します。

基底クラスの実装は何もせず、false を返します。

独自のモデルを実装する場合、移動をサポートしたいのであれば、この関数を再実装することができます。あるいは、データを変更するための独自のAPIを提供することもできます。

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

beginMoveColumns() およびendMoveColumns()参照してください。

[invokable] bool QAbstractItemModel::moveRow(const QModelIndex &sourceParent, int sourceRow, const QModelIndex &destinationParent, int destinationChild)

これをサポートするモデルでは、sourceParentsourceRowdestinationParentdestinationChild に移動します。

行の移動に成功した場合はtrue を返し、失敗した場合はfalse を返します。

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

moveRows() およびmoveColumn()も参照して ください。

[virtual invokable] bool QAbstractItemModel::moveRows(const QModelIndex &sourceParent, int sourceRow, int count, const QModelIndex &destinationParent, int destinationChild)

これをサポートするモデルでは、与えられたsourceRow から始まる行を親sourceParent の下にあるcount 行から、親destinationParent の下にあるdestinationChild 行に移動します。

行の移動に成功した場合はtrue を返し、失敗した場合はfalse を返します。

基底クラスの実装は何もせず、false を返します。

独自のモデルを実装する場合、移動をサポートしたいのであれば、この関数を再実装することができます。あるいは、データを変更するための独自のAPIを提供することもできます。

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

beginMoveRows() およびendMoveRows()も参照して ください。

[virtual, since 6.0] void QAbstractItemModel::multiData(const QModelIndex &index, QModelRoleDataSpan roleDataSpan) const

指定されたindex に対して、要求されたデータでroleDataSpan を埋めます。

デフォルトの実装では、スパン内の各ロールに対して単にdata() を呼び出します。サブクラスは、より効率的にビューにデータを提供するために、この関数を再実装することができます:

void MyModel::multiData(const QModelIndex &index, QModelRoleDataSpan roleDataSpan) const
{
    for (QModelRoleData &roleData : roleDataSpan) {
        int role = roleData.role();

        // ... obtain the data for index and role ...

        roleData.setData(result);
    }
}

上のスニペットでは、index は呼び出し全体で同じです。これは、index の情報を取得するために必要なデータ構造へのアクセスが一度だけで済むことを意味します(関連するコードをループの外に出す)。

QModelRoleData::setData ()、または同様にQVariant::setValue ()の使用は、QVariant を個別に構築したり、単純な代入演算子を使用するよりも推奨されます。これは、前者がQModelRoleData 内に格納されたQVariant オブジェクトのために既に割り当てられたメモリを再利用できるのに対し、後者は常に新しいバリアントを割り当て、古いものを破棄するためです。

ビューは、以前の呼び出しで使用されたスパンでmultiData()を呼び出す可能性があり、したがって、すでにいくつかのデータを含んでいる可能性があることに注意してください。したがって、モデルが与えられたロールのデータを返すことができない場合、対応するQModelRoleData オブジェクトのデータをクリアする必要があります。これは、QModelRoleData::clearData ()を呼び出すことによって行うことができます。また、同様に、QVariant などで構築されたデフォルトを設定することによって行うこともできます。データのクリアに失敗すると、ビューは "古い "データが対応するロールに使用されるものだと思い込むことになります。

最後に、コードの重複を避けるために、サブクラスはmultiData()の観点からdata()を再実装することもできます:

QVariant MyModel::data(const QModelIndex &index, int role) const
{
    QModelRoleData roleData(role);
    multiData(index, roleData);
    return roleData.data();
}

注: モデルは、スパン内のロールを変更したり、スパン要素を並べ替えたりすることはできません。これを行うと、未定義の動作になります。

: この関数に無効なモデル・インデックスを渡すことは違法です。

この関数は Qt 6.0 で導入されました。

QModelRoleDataSpan およびdata()も参照してください

[pure virtual invokable] QModelIndex QAbstractItemModel::parent(const QModelIndex &index) const

与えられたindex を持つモデル項目の親を返します。アイテムに親がない場合は、無効なQModelIndex が返されます。

ツリーデータ構造を公開するモデルでよく使われる慣習は、最初の列のアイテムだけが子を持つというものです。この場合、サブクラスでこの関数を再実装すると、返されるQModelIndex の列は 0 になります。

サブクラスでこの関数を再実装する場合、QModelIndex::parent() などのQModelIndex メンバ関数を呼び出さないように注意してください。自分のモデルに属するインデックスが自分の実装を呼び出すだけで、無限再帰につながるからです。

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

createIndex()も参照してください

[protected] QModelIndexList QAbstractItemModel::persistentIndexList() const

モデルに永続インデックスとして格納されているインデックスのリストを返します。

[invokable] bool QAbstractItemModel::removeColumn(int column, const QModelIndex &parent = QModelIndex())

指定されたparent の子項目から指定されたcolumn を削除します。

列が削除された場合はtrue を返し、そうでない場合はfalse を返します。

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

removeColumns(),removeRow(),insertColumn()も参照してください

[virtual invokable] bool QAbstractItemModel::removeColumns(int column, int count, const QModelIndex &parent = QModelIndex())

これをサポートするモデル上で、モデルから親parent の下にある、与えられたcolumn で始まるcount 列を削除します。

列の削除に成功した場合はtrue を返し、失敗した場合はfalse を返します。

基底クラスの実装は何もせず、false を返します。

独自のモデルを実装する場合、削除をサポートしたいのであれば、この関数を再実装することができます。あるいは、データを変更するための独自のAPIを提供することもできます。

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

removeColumn(),removeRows(),insertColumns(),beginRemoveColumns(),endRemoveColumns()参照。

[invokable] bool QAbstractItemModel::removeRow(int row, const QModelIndex &parent = QModelIndex())

指定されたparent の子項目から指定されたrow を削除します。

行が削除された場合はtrue を返し、そうでない場合はfalse を返します。

これはremoveRows() を呼び出す便利な関数である。removeRows() のQAbstractItemModel 実装は何もしません。

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

removeRows()、removeColumn()、insertRow()も参照して ください。

[virtual invokable] bool QAbstractItemModel::removeRows(int row, int count, const QModelIndex &parent = QModelIndex())

これをサポートするモデルでは、親であるparent の下にある、与えられたrow で始まるcount 行をモデルから削除します。

行の削除に成功した場合はtrue を返し、失敗した場合はfalse を返します。

基底クラスの実装は何もせず、false を返します。

独自のモデルを実装する場合、削除をサポートしたいのであれば、この関数を再実装することができます。あるいは、データを変更するための独自のAPIを提供することもできます。

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

removeRow(),removeColumns(),insertColumns(),beginRemoveRows(),endRemoveRows()も参照して ください。

[virtual protected slot] void QAbstractItemModel::resetInternalData()

このスロットはモデルの内部データがクリアされた直後に呼び出されます。

このスロットは、余分なデータを保持するQSortFilterProxyModel のサブクラスのような、具体的なプロキシモデルのサブクラスの便宜のために提供されています。

class CustomDataProxy : public QSortFilterProxyModel
{
    Q_OBJECT
public:
    CustomDataProxy(QObject *parent)
      : QSortFilterProxyModel(parent)
    {
    }

    ...

    QVariant data(const QModelIndex &index, int role) override
    {
        if (role != Qt::BackgroundRole)
            return QSortFilterProxyModel::data(index, role);

        if (m_customData.contains(index.row()))
            return m_customData.value(index.row());
        return QSortFilterProxyModel::data(index, role);
    }

private slots:
    void resetInternalData()
    {
        m_customData.clear();
    }

private:
  QHash<int, QVariant> m_customData;
};

注: 手違いにより、このスロットはQt 5.0にはありません。

modelAboutToBeReset() およびmodelReset()も参照してください

[virtual slot] void QAbstractItemModel::revert()

キャッシュされた情報を破棄することをモデルに知らせます。この関数は通常、行の編集に使用されます。

submit() も参照して ください。

[virtual] QHash<int, QByteArray> QAbstractItemModel::roleNames() const

モデルのロール名を返します。

Qtが設定するデフォルトのロール名は以下の通りです:

QtロールQMLロール名
Qt::DisplayRole表示
Qt::DecorationRole装飾
Qt::EditRole編集
Qt::ToolTipRoleツールチップ
Qt::StatusTipRoleステータスヒント
Qt::WhatsThisRoleこの値

[pure virtual invokable] int QAbstractItemModel::rowCount(const QModelIndex &parent = QModelIndex()) const

与えられたparent の下にある行の数を返します。親が有効な場合、rowCount は親の子の数を返すことを意味します。

注意 : テーブルベースのモデルを実装する場合、親が有効であれば rowCount() は 0 を返すべきです。

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

columnCount()も参照してください

[private signal] void QAbstractItemModel::rowsAboutToBeInserted(const QModelIndex &parent, int start, int end)

このシグナルは行がモデルに挿入される直前に発せられます。新しい項目は、startend の間、与えられたparent 項目の下に配置されます。

注意: このシグナルに接続されたコンポーネントは、モデルの寸法の変更に適応するためにこのシグナルを使用します。このシグナルはQAbstractItemModel の実装によってのみ発することができ、サブクラスのコードで明示的に発することはできません。

注意: これはプライベートシグナルです。シグナル接続で使用することはできますが、ユーザーが発することはできません。

insertRows() およびbeginInsertRows()も参照してください

[private signal] void QAbstractItemModel::rowsAboutToBeMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationRow)

このシグナルは、モデル内で行が移動される直前に発せられます。移動される項目は、指定されたsourceParent 項目の下にある、sourceStart からsourceEnd までの項目です。それらは、destinationRow 行から始まるdestinationParent に移動されます。

注意:このシグナルに接続されたコンポーネントは、モデルの寸法の変更に適応するためにこのシグナルを使用します。このシグナルはQAbstractItemModel の実装によってのみ発することができ、サブクラスのコードで明示的に発することはできません。

注意: これはプライベートシグナルです。シグナル接続で使用することはできますが、ユーザーが発することはできません。

beginMoveRows()も参照してください

[private signal] void QAbstractItemModel::rowsAboutToBeRemoved(const QModelIndex &parent, int first, int last)

このシグナルは、モデルから行が削除される直前に発せられます。削除される項目は、指定されたparent 項目の下にあるfirst からlast までの項目です。

注: このシグナルに接続されたコンポーネントは、モデルの寸法の変更に適応するためにこのシグナルを使用します。このシグナルはQAbstractItemModel の実装によってのみ発することができ、サブクラスのコードで明示的に発することはできません。

注意: これはプライベートシグナルです。シグナル接続で使用することはできますが、ユーザーが発することはできません。

removeRows() およびbeginRemoveRows()も参照してください

[private signal] void QAbstractItemModel::rowsInserted(const QModelIndex &parent, int first, int last)

このシグナルは、行がモデルに挿入された後に発行されます。新しい項目とは、first からlast までの項目で、指定されたparent 項目の下にあるものです。

注意: このシグナルに接続されたコンポーネントは、モデルの次元の変更に適応するためにこのシグナルを使用します。このシグナルはQAbstractItemModel の実装によってのみ発することができ、サブクラスのコードで明示的に発することはできません。

注意: これはプライベートシグナルです。シグナル接続で使用することはできますが、ユーザーが発することはできません。

insertRows() およびbeginInsertRows()も参照してください

[private signal] void QAbstractItemModel::rowsMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationRow)

このシグナルは、モデル内で行が移動された後に発行されます。指定されたsourceParent 項目の下にある、sourceStart からsourceEnd までの項目が、destinationRow 行から始まるdestinationParent に移動されました。

注意:このシグナルに接続されたコンポーネントは、モデルの寸法の変更に適応するためにこのシグナルを使用します。このシグナルはQAbstractItemModel 実装によってのみ発することができ、サブクラスのコードで明示的に発することはできません。

注意: これはプライベートシグナルです。シグナル接続で使用することはできますが、ユーザーが発することはできません。

beginMoveRows()も参照してください

[private signal] void QAbstractItemModel::rowsRemoved(const QModelIndex &parent, int first, int last)

このシグナルは、モデルから行が削除された後に発行されます。削除される項目は、指定されたparent 項目の下にあるfirst からlast までの項目です。

注意: このシグナルに接続されたコンポーネントは、モデルの次元の変更に適応するためにこのシグナルを使用します。このシグナルはQAbstractItemModel の実装によってのみ発することができ、サブクラスのコードで明示的に発することはできません。

注意: これはプライベートシグナルです。シグナル接続で使用することはできますが、ユーザーが発することはできません。

removeRows() およびbeginRemoveRows()も参照してください

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

index にある項目のrole データをvalue に設定します。

成功した場合はtrue を返し、失敗した場合はfalse を返します。

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

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

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

Qt::ItemDataRoledata()、itemData()も参照して ください。

[virtual] bool QAbstractItemModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole)

指定されたヘッダ内の指定されたrolesection のデータを、指定されたorientation と共に、指定されたvalue に設定します。

ヘッダーのデータが更新された場合はtrue を返し、そうでない場合はfalse を返す。

この関数を再実装する場合、headerDataChanged() シグナルを明示的に発する必要がある。

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

[virtual] bool QAbstractItemModel::setItemData(const QModelIndex &index, const QMap<int, QVariant> &roles)

Qt::ItemDataRole ごとに、index の項目のロール・データをroles の関連値に設定します。

成功した場合はtrue を返し、失敗した場合はfalse を返します。

roles にないロールは変更されません。

setData()、data()、およびitemData()も参照

[virtual invokable] QModelIndex QAbstractItemModel::sibling(int row, int column, const QModelIndex &index) const

index にある項目のrow およびcolumn にある兄弟、またはその位置に兄弟がない場合は無効なQModelIndex を返します。

sibling() は単に便利な関数で、アイテムの親を見つけ、それを使って指定されたrowcolumn にある子アイテムのインデックスを取得します。

このメソッドは、実装固有の最適化のためにオーバーライドすることもできます。

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

index(),QModelIndex::row(),QModelIndex::column()も参照して ください。

[virtual invokable] void QAbstractItemModel::sort(int column, Qt::SortOrder order = Qt::AscendingOrder)

与えられたordercolumn でモデルをソートします。

基底クラスの実装は何もしません。

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

[virtual] QSize QAbstractItemModel::span(const QModelIndex &index) const

index で表される項目の行と列のスパンを返します。

注意: 現在のところ、spanは使用されていません。

[virtual slot] bool QAbstractItemModel::submit()

この関数は、キャッシュされた情報を永続的なストレージに保存することをモデルに知らせます。この関数は通常、行の編集に使用されます。

エラーがなければtrue を返し、エラーがなければfalse を返します。

revert()も参照してください

[virtual] Qt::DropActions QAbstractItemModel::supportedDragActions() const

このモデルのデータがサポートするアクションを返します。

デフォルトの実装はsupportedDropActions() を返します。追加のアクションをサポートしたい場合は、この関数を再実装します。

supportedDragActions() は、ドラッグが発生したときのデフォルト値としてQAbstractItemView::startDrag() によって使用されます。

Qt::DropActions およびUsing drag and drop with item viewsも参照してください

[virtual] Qt::DropActions QAbstractItemModel::supportedDropActions() const

このモデルがサポートするドロップアクションを返します。

デフォルトの実装はQt::CopyAction を返します。追加のアクションをサポートしたい場合は、この関数を再実装してください。また、dropMimeData() 関数を再実装して、追加操作を処理する必要があります。

dropMimeData()、Qt::DropActions 、およびUsing drag and drop with item viewsも参照して ください。

本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。