このページでは

QDataWidgetMapper Class

QDataWidgetMapper クラスは、データモデルの特定の部分とウィジェットとの間のマッピングを提供します。詳細...

ヘッダー: #include <QDataWidgetMapper>
CMake: find_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmake: QT += widgets
継承元: QObject

パブリック型

enum SubmitPolicy { AutoSubmit, ManualSubmit }

プロパティ

パブリック関数

QDataWidgetMapper(QObject *parent = nullptr)
virtual ~QDataWidgetMapper()
void addMapping(QWidget *widget, int section)
void addMapping(QWidget *widget, int section, const QByteArray &propertyName)
void clearMapping()
int currentIndex() const
QAbstractItemDelegate *itemDelegate() const
QByteArray mappedPropertyName(QWidget *widget) const
int mappedSection(QWidget *widget) const
QWidget *mappedWidgetAt(int section) const
QAbstractItemModel *model() const
Qt::Orientation orientation() const
void removeMapping(QWidget *widget)
QModelIndex rootIndex() const
void setItemDelegate(QAbstractItemDelegate *delegate)
void setModel(QAbstractItemModel *model)
void setOrientation(Qt::Orientation aOrientation)
void setRootIndex(const QModelIndex &index)
void setSubmitPolicy(QDataWidgetMapper::SubmitPolicy policy)
QDataWidgetMapper::SubmitPolicy submitPolicy() const

パブリックスロット

void revert()
virtual void setCurrentIndex(int index)
void setCurrentModelIndex(const QModelIndex &index)
bool submit()
void toFirst()
void toLast()
void toNext()
void toPrevious()

シグナル

void currentIndexChanged(int index)

詳細な説明

QDataWidgetMapper を使用すると、ウィジェットをアイテムモデルのセクションにマッピングすることで、データ連動型ウィジェットを作成できます。セクションとは、方向が水平(デフォルト)の場合はモデルの列を指し、それ以外の場合は行を指します。

現在のインデックスが変更されるたびに、各ウィジェットは、マッピング時に指定されたプロパティを介して、モデルからのデータで更新されます。ユーザーがウィジェットの内容を編集した場合、その変更は同じプロパティを使用して読み取られ、モデルに書き戻されます。 デフォルトでは、各ウィジェットのuser property が、モデルとウィジェット間のデータ転送に使用されます。Qt 4.3以降では、追加されたaddMapping()関数により、デフォルトのuserプロパティの代わりに名前付きプロパティを使用できるようになりました。

カスタムウィジェットをサポートするために、アイテムデリゲートを設定することが可能です。デフォルトでは、QStyledItemDelegate がモデルとウィジェット間の同期に使用されます。

model という名前のアイテムモデルがあり、その内容が以下の通りであると仮定しましょう。

1Qt Norwayオスロ
2Qt オーストラリアブリスベン
3Qt USAパロアルト
4Qt 中国北京
5Qt ドイツベルリンベルリン

以下のコードは、モデルの列を、mySpinBox 、myLineEdit 、myCountryChooser というウィジェットにマッピングします:

QDataWidgetMapper *mapper = new QDataWidgetMapper;
mapper->setModel(model);
mapper->addMapping(mySpinBox, 0);
mapper->addMapping(myLineEdit, 1);
mapper->addMapping(myCountryChooser, 2);
mapper->toFirst();

toFirst() の呼び出し後、mySpinBox には1 の値が表示され、myLineEdit にはQt Norway が表示され、myCountryChooser にはOslo が表示されます。ナビゲーション関数であるtoFirst()、toNext()、toPrevious()、toLast()、およびsetCurrentIndex() を使用すると、モデル内を移動し、モデルからの内容でウィジェットを更新することができます。

setRootIndex() 関数を使用すると、モデル内の特定の項目をルートインデックスとして指定できます。この項目の子要素は、ユーザーインターフェースの関連するウィジェットにマッピングされます。

QDataWidgetMapper は、AutoSubmit とManualSubmit の 2 つの送信ポリシーをサポートしています。AutoSubmit は、現在のウィジェットがフォーカスを失った直後にモデルを更新します。ManualSubmit は、submit() が呼び出されない限り、モデルを更新しません。ManualSubmit は、ユーザーがすべての変更をキャンセルできるダイアログを表示する際に役立ちます。また、モデルを表示する他のビューも、ユーザーがすべての変更を完了して送信するまで更新されません。

QDataWidgetMapper は外部からの変更を追跡していることに注意してください。アプリケーションの別のモジュールでモデルの内容が更新されると、ウィジェットも同様に更新されます。

QAbstractItemModel およびQAbstractItemDelegateも参照してください 。

メンバ型のドキュメント

enum QDataWidgetMapper::SubmitPolicy

この列挙型は、QDataWidgetMapper がサポートする送信ポリシーを定義します。

定数値説明
QDataWidgetMapper::AutoSubmit0ウィジェットのフォーカスが外れるたびに、ウィジェットの現在の値がアイテムモデルに設定されます。
QDataWidgetMapper::ManualSubmit1submit() が呼び出されるまで、モデルは更新されません。

プロパティのドキュメント

currentIndex : int

このプロパティには、現在の行または列が格納されます

ウィジェットには、向きが水平(デフォルト)の場合はindex の行のデータが、それ以外の場合はindex の列のデータが設定されます。

アクセス関数:

int currentIndex() const
virtual void setCurrentIndex(int index)

通知シグナル:

void currentIndexChanged(int index)

関連項目: setCurrentModelIndex()、toFirst()、toNext()、toPrevious()、およびtoLast()。

orientation : Qt::Orientation

このプロパティは、モデルの向きを保持します

向きがQt::Horizontal (デフォルト)の場合、ウィジェットはデータモデルの列にマッピングされます。ウィジェットには、マッピングされた列およびcurrentIndex()が指す行からのモデルデータが入力されます。

次のような表形式のデータには、Qt::Horizontal を使用してください:

1Qt Norwayオスロ
2Qt オーストラリアブリスベン
3Qt USAシリコンバレー
4Qt 中国北京
5Qt ドイツベルリン

オリエンテーションがQt::Vertical に設定されている場合、ウィジェットは行にマッピングされます。setCurrentIndex()を呼び出すと、現在の列が変更されます。ウィジェットには、マッピングされた行およびcurrentIndex()が指す列からのモデルのデータが設定されます。

次のような表形式のデータには、Qt::Vertical を使用してください:

12345
Qt ノルウェーQt オーストラリアQt 米国Qt 中国Qt ドイツ
オスロブリスベンシリコンバレー北京ベルリン

向きを変更すると、既存のマッピングがすべてクリアされます。

アクセス関数:

Qt::Orientation orientation() const
void setOrientation(Qt::Orientation aOrientation)

submitPolicy : SubmitPolicy

このプロパティには、現在の送信ポリシーが格納されています

現在の送信ポリシーを変更すると、すべてのウィジェットがモデルからの現在のデータに戻ります。

アクセス関数:

QDataWidgetMapper::SubmitPolicy submitPolicy() const
void setSubmitPolicy(QDataWidgetMapper::SubmitPolicy policy)

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

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

親オブジェクトparent を持つ新しいQDataWidgetMapperを構築します。デフォルトでは、配置方向は水平で、送信ポリシーはAutoSubmit です。

setOrientation() およびsetSubmitPolicy()も参照してください 。

[virtual noexcept] QDataWidgetMapper::~QDataWidgetMapper()

そのオブジェクトを破棄します。

void QDataWidgetMapper::addMapping(QWidget *widget, int section)

モデル内の「widget 」と「section 」間のマッピングを追加します。「section 」は、方向が水平(デフォルト)の場合はモデル内の列となり、それ以外の場合は行となります。

以下の例では、2つの列を持つモデルmyModel を想定します。1つ目の列にはグループのメンバーの名前が、2つ目の列にはそれぞれの年齢が含まれています。1つ目の列はQLineEdit のnameLineEdit にマッピングされ、2つ目の列はQSpinBox のageSpinBox にマッピングされます:

QDataWidgetMapper *mapper = new QDataWidgetMapper;
mapper->setModel(myModel);
mapper->addMapping(nameLineEdit, 0);
mapper->addMapping(ageSpinBox, 1);

注:

  • widget がすでにセクションにマッピングされている場合、古いマッピングは新しいマッピングに置き換えられます。
  • セクションとウィジェット間のマッピングは、一対一のみ許可されます。1つのセクションを複数のウィジェットにマッピングしたり、1つのウィジェットを複数のセクションにマッピングしたりすることはできません。

関連項目: removeMapping()、mappedSection()、およびclearMapping()も参照してください 。

void QDataWidgetMapper::addMapping(QWidget *widget, int section, const QByteArray &propertyName)

基本的には addMapping() と同じですが、propertyName を指定することで、使用するプロパティを指定できるようになっています。

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

void QDataWidgetMapper::clearMapping()

すべてのマッピングをクリアします。

addMapping() およびremoveMapping()も参照してください 。

[signal] void QDataWidgetMapper::currentIndexChanged(int index)

このシグナルは、現在のインデックスが変更され、すべてのウィジェットに新しいデータが反映された後に発火します。index は新しい現在のインデックスです。

注: プロパティ `currentIndex` に対する通知 シグナルです。

currentIndex() およびsetCurrentIndex()も参照してください 。

QAbstractItemDelegate *QDataWidgetMapper::itemDelegate() const

現在のアイテムのデリゲートを返します。

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

QByteArray QDataWidgetMapper::mappedPropertyName(QWidget *widget) const

指定されたwidget にデータをマッピングする際に使用されるプロパティ名を返します。

mappedSection()、addMapping()、およびremoveMapping()も参照してください 。

int QDataWidgetMapper::mappedSection(QWidget *widget) const

widget がマッピングされているセクションを返します。ウィジェットがマッピングされていない場合は -1 を返します。

addMapping() およびremoveMapping()も参照してください 。

QWidget *QDataWidgetMapper::mappedWidgetAt(int section) const

section にマッピングされているウィジェットを返します。そのセクションにマッピングされているウィジェットがない場合は 0 を返します。

addMapping() およびremoveMapping()も参照してください 。

QAbstractItemModel *QDataWidgetMapper::model() const

現在のモデルを返します。

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

void QDataWidgetMapper::removeMapping(QWidget *widget)

指定されたwidget のマッピングを削除します。

addMapping() およびclearMapping()も参照してください 。

[slot] void QDataWidgetMapper::revert()

モデルの現在のデータですべてのウィジェットを再読み込みします。未送信の変更内容はすべて失われます。

submit() およびsetSubmitPolicy()も参照してください 。

QModelIndex QDataWidgetMapper::rootIndex() const

現在のルートインデックスを返します。

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

[slot] void QDataWidgetMapper::setCurrentModelIndex(const QModelIndex &index)

オリエンテーションが水平(デフォルト)の場合は、現在のインデックスをindex の行に設定し、それ以外の場合はindex の列に設定します。

内部でsetCurrentIndex()を呼び出します。この利便性スロットは、他のビューのselection model のシグナルcurrentRowChanged()またはcurrentColumnChanged()に接続することができます。

以下の例は、myTableView という名前のQTableView の選択が変更されるたびに、すべてのウィジェットを新しいデータで更新する方法を示しています:

QDataWidgetMapper *mapper = new QDataWidgetMapper;
connect(myTableView->selectionModel(), &QItemSelectionModel::currentRowChanged,
        mapper, &QDataWidgetMapper::setCurrentModelIndex);

「currentIndex()」も参照してください 。

void QDataWidgetMapper::setItemDelegate(QAbstractItemDelegate *delegate)

アイテムのデリゲートを `delegate` に設定します。このデリゲートは、QAbstractItemDelegate::setEditorData() およびQAbstractItemDelegate::setModelData() を使用して、モデルからウィジェットへ、またウィジェットからモデルへデータを書き込むために使用されます。

既存のデリゲートは削除されますが、破棄されることはありません。QDataWidgetMapper はdelegate の所有権を取得しません。

また、デリゲートは、QAbstractItemDelegate::commitData() およびQAbstractItemDelegate::closeEditor() を使用して、データを適用するタイミングやエディタを変更するタイミングを決定します。

警告: ウィジェットマッパーやビュー間で、同じデリゲートのインスタンスを共有してはなりません 。そうすると、特定のデリゲートに接続された各ビューがcloseEditor() シグナルを受信し、すでに閉じられているエディタにアクセスしたり、変更したり、閉じようとしたりするため、不正確または直感に反する編集動作を引き起こす可能性があります。

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

void QDataWidgetMapper::setModel(QAbstractItemModel *model)

現在のモデルを `model` に設定します。別のモデルが設定されていた場合、その古いモデルへのすべてのマッピングがクリアされます。

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

void QDataWidgetMapper::setRootIndex(const QModelIndex &index)

ルート項目を `index` に設定します。これは、ツリーの特定のブランチを表示するために使用できます。無効なモデルインデックスを指定すると、最上位のブランチが表示されます。

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

[slot] bool QDataWidgetMapper::submit()

マッピングされたウィジェットからのすべての変更をモデルに送信します。

マッピングされた各セクションについて、アイテムデリゲートはウィジェットから現在の値を読み取り、それをモデルに設定します。最後に、モデルのsubmit()メソッドが呼び出されます。

すべての値が送信された場合はtrue を返し、そうでない場合はfalseを返します。

注:データベースモデルの場合、QSqlQueryModel::lastError() を使用して最後のエラーを取得できます。

関連項目: revert() およびsetSubmitPolicy()。

[slot] void QDataWidgetMapper::toFirst()

オリエンテーションが水平(デフォルト)の場合は、モデルの最初の行のデータをウィジェットに設定し、それ以外の場合は最初の列のデータを設定します。

これは、setCurrentIndex(0) を呼び出すのと同じです。

toLast() およびsetCurrentIndex()も参照してください 。

[slot] void QDataWidgetMapper::toLast()

オリエンテーションが水平(デフォルト)の場合は、モデルの最後の行のデータをウィジェットに設定し、それ以外の場合は最後の列のデータを設定します。

内部でsetCurrentIndex()を呼び出します。

toFirst() およびsetCurrentIndex()も参照してください 。

[slot] void QDataWidgetMapper::toNext()

方向が水平(デフォルト)の場合は、モデルの次の行のデータをウィジェットに設定し、それ以外の場合は次の列のデータを設定します。

内部でsetCurrentIndex()を呼び出します。モデルに次の行がない場合は何も行いません。

toPrevious() およびsetCurrentIndex()も参照してください 。

[slot] void QDataWidgetMapper::toPrevious()

方向が水平(デフォルト)の場合は、モデルの前の行のデータをウィジェットに設定し、それ以外の場合は前の列のデータを設定します。

内部でsetCurrentIndex()を呼び出します。モデルに前の行が存在しない場合は何も行いません。

toNext() およびsetCurrentIndex()も参照してください 。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.