Auf dieser Seite

Beispiel für den „Combo Widget Mapper“

Das Beispiel zum „Combo Widget Mapper“ zeigt, wie man mit einem „ QDataWidgetMapper “ Informationen aus einem Modell bestimmten Widgets in einem Formular zuordnet.

Antrag mit verschiedenen Feldern wie Name, Adresse und Art

Wir erstellen eine „ Window “-Klasse mit einer nahezu identischen Benutzeroberfläche, mit dem Unterschied, dass wir anstelle eines Drehfelds zur Eingabe des Alters jeder Person ein Kombinationsfeld bereitstellen, über das die Adressen als „Privat“, „Arbeit“ oder „Sonstiges“ klassifiziert werden können.

Definition der Klasse „Person“

Wir definieren eine Struktur „ Person “, die Name, Adresse und Adresstyp enthält, um die Modelldaten darzustellen:

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

Sie wird als „ Q_GADGET “ deklariert, wobei die Mitglieder Eigenschaften mit dem gleichen Namen sind, um eine „ QRangeModel “ bequem füllen zu können.

Definition der Fensterklasse

Die Klasse stellt einen Konstruktor und einen Slot bereit, um die Schaltflächen auf dem neuesten Stand zu halten:

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

Zusätzlich zum „ QDataWidgetMapper “-Objekt und den Steuerelementen, aus denen die Benutzeroberfläche besteht, verwenden wir ein „ QList<Person>“ zur Speicherung unserer Daten sowie ein „ QRangeModel “, das darauf zugreift.

Implementierung der Fensterklasse

Der Konstruktor der Klasse „ Window “ lässt sich in mehrere Teile untergliedern. Im ersten Teil richten wir die für die Benutzeroberfläche verwendeten Widgets ein:

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

Die Personenliste wird mithilfe einer Initialisierungsliste gefüllt, die anschließend an die Klasse ` QRangeModel` übergeben wird:

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

Beachten Sie, dass wir die Zuordnung der Kombinationsfelds auf dieselbe Weise wie bei anderen Widgets einrichten, ihr jedoch ein eigenes Modell zuweisen, das Informationen über die Adresstypen enthält, sodass es die Zeichenfolge des Adresstyps anstelle der Daten aus dem Modell anzeigt, das Daten zu jeder Person enthält:

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

Als Nächstes richten wir den Widget-Mapper ein und ordnen jedes Eingabe-Widget einer Spalte im Modell zu, die durch den Aufruf von ` setModel()` festgelegt wird:

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

Für die Kombinationsliste übergeben wir ein zusätzliches Argument, um dem Widget-Mapper mitzuteilen, welche Eigenschaft mit den Werten aus dem Modell verknüpft werden soll. Dadurch kann der Benutzer ein Element aus der Kombinationsliste auswählen, und der entsprechende Wert, der in der Eigenschaft ` currentIndex ` des Widgets gespeichert ist, wird im Modell abgelegt.

Der Rest des Konstruktors richtet Verbindungen und Layouts ein:

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

Zuordnung des Modells zur Ansicht mithilfe eines Delegaten

Der Vollständigkeit halber zeigen wir die Implementierung des Slots „ updateButtons() “:

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

Zusammenfassung und weiterführende Literatur

Die Verwendung eines separaten Modells für die Kombinationsfeld bietet ein Auswahlmenü, das von den im Hauptmodell gespeicherten Daten getrennt ist. Durch die Verwendung einer benannten Zuordnung, die die Eigenschaft ` currentIndex ` des Kombinationsfelds mit einer Spalte im Modell verknüpft, können wir effektiv einen Nachschlagewert im Modell speichern.

Wenn wir das Modell jedoch außerhalb des Kontexts des Widget-Mappers auslesen, müssen wir die „ typeModel “ kennen, um diese Nachschlagewerte interpretieren zu können. Es wäre sinnvoll, sowohl die Daten als auch die Auswahlmöglichkeiten der „ typeModel “ an einem Ort speichern zu können. Dies wird im Beispiel zum SQL-Widget-Mapper behandelt.

Beispielprojekt @ 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.