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() 関数が追加され、デフォルトのユーザ・プロパティの代わりに名前付きプロパティを使用できるようになりました。

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

model という名前のアイテムモデルがあり、以下のような内容になっているとします:

1Qt ノルウェーオスロ
2Qt オーストラリアブリスベン
3Qtアメリカパロアルト
4中国北京
5Qt ドイツベルリン

次のコードは、モデルのカラムをmySpinBoxmyLineEditmyCountryChooser というウィジェットにマッピングします:

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

toFirst() の呼び出しの後、mySpinBox は値1 を表示し、myLineEditQt Norway を表示し、myCountryChooserOslo を表示します。ナビゲーショ ン関数toFirst(),toNext(),toPrevious(),toLast(),setCurrentIndex() を使用して、モデル内をナビゲートし、モデルの内容でウィジェットを更新することができます。

setRootIndex() 関数は、モデル内の特定のアイテムをルートインデックスとして指定することを可能にします - このアイテムの子は、ユーザーインターフェイスの関連するウィジェットにマッピングされます。

QDataWidgetMapper は、AutoSubmitManualSubmit の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

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

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

次のような表形式のデータには、Qt::Horizontal を使います:

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

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

以下のような表形式のデータには、Qt::Vertical を使用します:

12345
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)

モデルからwidgetsection の間のマッピングを追加します。section は、水平方向(デフォルト)であればモデルの列であり、そうでなければ行です。

次の例では、2つの列を持つモデルmyModel を想定します:最初の列はグループの人々の名前を含み、2番目の列は彼らの年齢を含みます。最初の列はQLineEdit nameLineEdit にマップされ、2番目の列はQSpinBox ageSpinBox にマップされる:

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

注意事項

  • widget がすでにセクションにマッピングされている場合、古いマッピングは新しいマッピングに置き換えられます。
  • セクションとウィジェットのマッピングは1対1のみ可能です。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() を使用して、モデルからウィジェットに、ウィジェットからモデルにデータを書き込むために使用されます。

QDataWidgetMapperdelegate の所有権を持ちません。

デリゲートはまた、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()も参照してください

© 2025 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.