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 } |
プロパティ
- 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() 関数が追加され、デフォルトのユーザ・プロパティの代わりに名前付きプロパティを使用できるようになりました。
カスタムウィジェットをサポートするために、アイテムデリゲートを設定することも可能です。デフォルトでは、QStyledItemDelegate がモデルとウィジェットの同期に使用されます。
model
という名前のアイテムモデルがあり、以下のような内容になっているとします:
1 | Qt ノルウェー | オスロ |
2 | Qt オーストラリア | ブリスベン |
3 | Qtアメリカ | パロアルト |
4 | 中国 | 北京 |
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
このプロパティは、モデルの向きを保持します。
Orientation がQt::Horizontal (デフォルト) の場合、ウィジェットはデータモデルのカラムにマッピングされます。ウィジェットは、マッピングされた列とcurrentIndex() が指す行から、モデルのデータを入力します。
次のような表形式のデータには、Qt::Horizontal を使います:
1 | Qt ノルウェー | オスロ |
2 | Qtオーストラリア | ブリスベン |
3 | Qtアメリカ | シリコンバレー |
4 | 中国 | 北京 |
5 | Qtドイツ | ベルリン |
Orientation がQt::Vertical に設定されている場合、ウィジェットは行にマッピングされます。setCurrentIndex() を呼び出すと、現在の列が変更されます。ウィジェットは、マップされた行とcurrentIndex() が指す列から、モデルのデータを入力します。
以下のような表形式のデータには、Qt::Vertical を使用します:
1 | 2 | 3 | 4 | 5 |
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
を想定しています:最初の列はグループの人々の名前を含み、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() を使用して、モデルからウィジェットに、およびウィジェットからモデルにデータを書き込むために使用されます。
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()も参照してください 。
本書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。