コンボウィジェットマッパーの例
コンボウィジェットマッパーの例では、QDataWidgetMapper を使ってモデルからフォーム上の特定のウィジェットに情報をマッピングする方法を示します。

各人の年齢を入力できるようにスピンボックスを提供する代わりに、住所を "Home"、"Work"、または "Other "に分類できるようにコンボボックスを提供することを除いて、ほぼ同じユーザインタフェースを持つWindow クラスを作成します。
Personクラスの定義
モデル・データを表すために、名前、住所、住所タイプを含む構造体Person を定義します:
struct Person { private: Q_GADGET Q_PROPERTY(QString name MEMBER name) Q_PROPERTY(QString address MEMBER address) Q_PROPERTY(QString type MEMBER type) public: QString name; QString address; QString type; };
これは、QRangeModel に便利に入力できるように、同じ名前のプロパティをメンバとするQ_GADGET として宣言されています。
ウィンドウクラスの定義
このクラスはコンストラクタと、ボタンを最新の状態に保つためのスロットを提供します:
class Window : public QWidget { Q_OBJECT public: Window(QWidget *parent = nullptr); private slots: void updateButtons(int row); private: QLineEdit *nameEdit; QTextEdit *addressEdit; QComboBox *typeComboBox; QPushButton *nextButton; QPushButton *previousButton; QList<Person> data; QRangeModel *model; QDataWidgetMapper *mapper; };
QDataWidgetMapper 、ユーザーインターフェイスを構成するためのコントロールに加えて、QList<Person>を使用してデータを保持し、QRangeModel 。
ウィンドウ・クラスの実装
Window クラスのコンストラクタはいくつかの部分に分けて説明できる。最初の部分では、ユーザー・インターフェースに使用するウィジェットを設定します:
Window::Window(QWidget *parent) : QWidget(parent), nameEdit(new QLineEdit), addressEdit(new QTextEdit), typeComboBox(new QComboBox), nextButton(new QPushButton(tr("&Next"))), previousButton(new QPushButton(tr("&Previous"))),
人物リストにはイニタライザー・リストが使われ、それがQRangeModel に渡されます:
data{Person{u"Alice"_s, u"<qt>123 Main Street<br/>Market Town</qt>"_s, u"0"_s},
Person{u"Bob"_s, u"<qt>PO Box 32<br/>Mail Handling Service<br/>Service City</qt>"_s, u"1"_s},
Person{u"Carol"_s, u"<qt>The Lighthouse<br/>Remote Island</qt>"_s, u"2"_s},
Person{u"Donald"_s, u"<qt>47338 Park Avenue<br/>Big City</qt>"_s, u"0"_s},
Person{u"Emma"_s, u"<qt>Research Station<br/>Base Camp<br/>Big Mountain</qt>"_s, u"2"_s}},
model(new QRangeModel(data, this)),
mapper(new QDataWidgetMapper(this))コンボボックスのマッピングは、他のウィジェットと同じように設定しますが、住所のタイプに関する情報を保持する独自のモデルを適用して、各人に関するデータを含むモデルからのデータではなく、住所のタイプ文字列を表示するようにします:
typeComboBox->setModel(new QStringListModel({ tr("Home"), tr("Work"), tr("Other") }, this));
次に、ウィジェットマッパーをセットアップし、各入力ウィジェットをsetModel() の呼び出しで指定されたモデルのカラムに関連付けます:
mapper->setModel(model); mapper->addMapping(nameEdit, 0); mapper->addMapping(addressEdit, 1); mapper->addMapping(typeComboBox, 2, "currentIndex");
コンボボックスについては、モデルからの値に関連付けるプロパティをウィジェットマッパーに伝えるために、追加の引数を渡します。その結果、ユーザはコンボボックスから項目を選択でき、ウィジェットのcurrentIndex プロパティに格納された対応する値がモデルに格納されます。
コンストラクタの残りの部分では、接続とレイアウトを設定します:
connect(previousButton, &QAbstractButton::clicked, mapper, &QDataWidgetMapper::toPrevious); connect(nextButton, &QAbstractButton::clicked, mapper, &QDataWidgetMapper::toNext); connect(mapper, &QDataWidgetMapper::currentIndexChanged, this, &Window::updateButtons); auto *formLayout = new QFormLayout; formLayout->addRow(tr("Na&me:"), nameEdit); formLayout->addRow(tr("&Address:"), addressEdit); formLayout->addRow(tr("&Type:"), typeComboBox); auto *buttonLayout = new QVBoxLayout; buttonLayout->addWidget(previousButton); buttonLayout->addWidget(nextButton); buttonLayout->addStretch(); auto *mainLayout = new QHBoxLayout(this); mainLayout->addLayout(formLayout); mainLayout->addLayout(buttonLayout); setWindowTitle(tr("Delegate Widget Mapper")); mapper->toFirst(); }

念のため、updateButtons() スロットの実装を示します:
void Window::updateButtons(int row) { previousButton->setEnabled(row > 0); nextButton->setEnabled(row < model->rowCount() - 1); }
まとめと参考文献
コンボボックスに別のモデルを使用することで、メインモデルに格納されたデータとは別の選択肢のメニューを提供します。コンボボックスのcurrentIndex プロパティをモデルのカラムに関連付ける名前付きマッピングを使用することで、ルックアップ値を効果的にモデルに格納することができます。
しかし、ウィジェットマッパーのコンテキスト外でモデルを読み取る場合、これらのルックアップ値を理解するために、typeModel について知る必要があります。typeModel によって保持されるデータと選択肢の両方を1つの場所に格納できると便利です。これはSQL Widget Mapper Exampleでカバーされています。
© 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.