QDataWidgetMapper Class

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

Header: #include <QDataWidgetMapper>
CMake: find_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmake: QT += widgets
Inherits: 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()も参照してください

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