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 } |
プロパティ
- currentIndex : int
- orientation : Qt::Orientation
- submitPolicy : SubmitPolicy
パブリック関数
| 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 という名前のアイテムモデルがあり、その内容が以下の通りであると仮定しましょう。
| 1 | Qt Norway | オスロ |
| 2 | Qt オーストラリア | ブリスベン |
| 3 | Qt USA | パロアルト |
| 4 | Qt 中国 | 北京 |
| 5 | Qt ドイツベルリン | ベルリン |
以下のコードは、モデルの列を、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::AutoSubmit | 0 | ウィジェットのフォーカスが外れるたびに、ウィジェットの現在の値がアイテムモデルに設定されます。 |
QDataWidgetMapper::ManualSubmit | 1 | submit() が呼び出されるまで、モデルは更新されません。 |
プロパティのドキュメント
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 を使用してください:
| 1 | Qt Norway | オスロ |
| 2 | Qt オーストラリア | ブリスベン |
| 3 | Qt USA | シリコンバレー |
| 4 | Qt 中国 | 北京 |
| 5 | Qt ドイツ | ベルリン |
オリエンテーションがQt::Vertical に設定されている場合、ウィジェットは行にマッピングされます。setCurrentIndex()を呼び出すと、現在の列が変更されます。ウィジェットには、マッピングされた行およびcurrentIndex()が指す列からのモデルのデータが設定されます。
次のような表形式のデータには、Qt::Vertical を使用してください:
| 1 | 2 | 3 | 4 | 5 |
| 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.