Sur cette page

Exemple d'utilisation du Combo Widget Mapper

L'exemple « Combo Widget Mapper » montre comment utiliser un « QDataWidgetMapper » pour mapper les informations d'un modèle vers des widgets spécifiques d'un formulaire.

Formulaire comportant différents champs, tels que « Nom », « Adresse » et « Type »

Nous créons une classe « Window » dotée d’une interface utilisateur presque identique, à la différence près qu’au lieu d’utiliser une zone de sélection rotative pour saisir l’âge de chaque personne, nous utilisons une liste déroulante permettant de classer leurs adresses dans les catégories « Domicile », « Travail » ou « Autre ».

Définition de la classe Person

Nous définissons une structure Person contenant le nom, l’adresse et le type d’adresse pour représenter les données du modèle :

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;
};

Elle est déclarée comme une structure « Q_GADGET » dont les membres sont des propriétés portant le même nom, afin de pouvoir facilement remplir une instance de la classe « QRangeModel ».

Définition de la classe « Window »

La classe fournit un constructeur et un slot pour maintenir les boutons à jour :

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;
};

Outre l’objet ` QDataWidgetMapper ` et les contrôles utilisés pour constituer l’interface utilisateur, nous utilisons un ` QList<Person>` pour stocker nos données et un ` QRangeModel ` qui opère sur celles-ci.

Implémentation de la classe Window

Le constructeur de la classe Window peut être décomposé en plusieurs parties. Dans la première partie, nous configurons les widgets utilisés pour l’interface utilisateur :

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"))),

La liste des personnes est remplie à l’aide d’une liste d’initialisation, qui est ensuite transmise à la classe ` 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))

Notez que nous configurons le mappage de la liste déroulante de la même manière que pour les autres widgets, mais que nous lui appliquons son propre modèle contenant des informations sur les types d’adresse, afin qu’elle affiche la chaîne de type d’adresse plutôt que les données du modèle contenant des informations sur chaque personne :

    typeComboBox->setModel(new QStringListModel({ tr("Home"), tr("Work"), tr("Other") }, this));

Ensuite, nous configurons le mappeur de widgets, en associant chaque widget d’entrée à une colonne du modèle spécifiée par l’appel à ` setModel()` :

    mapper->setModel(model);
    mapper->addMapping(nameEdit, 0);
    mapper->addMapping(addressEdit, 1);
    mapper->addMapping(typeComboBox, 2, "currentIndex");

Pour la liste déroulante, nous transmettons un argument supplémentaire afin d’indiquer au mappeur de widgets quelle propriété associer aux valeurs du modèle. Ainsi, lorsque l’utilisateur sélectionne un élément dans la liste déroulante, la valeur correspondante stockée dans la propriété ` currentIndex ` du widget est enregistrée dans le modèle.

Le reste du constructeur configure les connexions et les mises en page :

    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();
}

Mappage du modèle vers la vue à l'aide d'un délégué

Par souci d’exhaustivité, nous présentons ici l’implémentation du slot ` updateButtons() ` :

void Window::updateButtons(int row)
{
    previousButton->setEnabled(row > 0);
    nextButton->setEnabled(row < model->rowCount() - 1);
}

Résumé et lectures complémentaires

L’utilisation d’un modèle distinct pour la liste déroulante fournit un menu de choix indépendant des données stockées dans le modèle principal. L’utilisation d’un mappage nommé qui relie la propriété ` currentIndex ` de la liste déroulante à une colonne du modèle nous permet en effet de stocker une valeur de référence dans le modèle.

Cependant, lors de la lecture du modèle en dehors du contexte du mappeur de widgets, il est nécessaire de connaître l’ typeModel pour donner un sens à ces valeurs de référence. Il serait utile de pouvoir stocker à la fois les données et les choix contenus dans l’ typeModel au même endroit. C’est ce qu’illustre l’exemple « SQL Widget Mapper ».

Exemple de projet @ code.qt.io

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