QDataWidgetMapper Class
Die Klasse QDataWidgetMapper ermöglicht das Mapping zwischen einem Abschnitt eines Datenmodells und Widgets. Mehr...
Kopfzeile: | #include <QDataWidgetMapper> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Widgets) target_link_libraries(mytarget PRIVATE Qt6::Widgets) |
qmake: | QT += widgets |
Vererbungen: | QObject |
Öffentliche Typen
enum | SubmitPolicy { AutoSubmit, ManualSubmit } |
Eigenschaften
- currentIndex : int
- orientation : Qt::Orientation
- submitPolicy : SubmitPolicy
Öffentliche Funktionen
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 |
Öffentliche Slots
void | revert() |
virtual void | setCurrentIndex(int index) |
void | setCurrentModelIndex(const QModelIndex &index) |
bool | submit() |
void | toFirst() |
void | toLast() |
void | toNext() |
void | toPrevious() |
Signale
void | currentIndexChanged(int index) |
Detaillierte Beschreibung
QDataWidgetMapper kann verwendet werden, um datenorientierte Widgets zu erstellen, indem sie auf Abschnitte eines Elementmodells abgebildet werden. Ein Abschnitt ist eine Spalte eines Modells, wenn die Ausrichtung horizontal ist (die Vorgabe), ansonsten eine Zeile.
Jedes Mal, wenn sich der aktuelle Index ändert, wird jedes Widget mit Daten aus dem Modell über die bei der Zuordnung angegebene Eigenschaft aktualisiert. Wenn der Benutzer den Inhalt eines Widgets bearbeitet, werden die Änderungen über dieselbe Eigenschaft gelesen und in das Modell zurückgeschrieben. Standardmäßig wird die user property eines jeden Widgets verwendet, um Daten zwischen dem Modell und dem Widget zu übertragen. Seit Qt 4.3 ermöglicht eine zusätzliche Funktion addMapping() die Verwendung einer benannten Eigenschaft anstelle der standardmäßigen Benutzereigenschaft.
Es ist möglich, einen Item-Delegaten zu setzen, um benutzerdefinierte Widgets zu unterstützen. Standardmäßig wird ein QStyledItemDelegate verwendet, um das Modell mit den Widgets zu synchronisieren.
Nehmen wir an, dass wir ein Elementmodell mit dem Namen model
und folgendem Inhalt haben:
1 | Qt Norwegen | Oslo |
2 | Qt Australien | Brisbane |
3 | Qt USA | Palo Alto |
4 | Qt China | Peking |
5 | Qt Deutschland | Berlin |
Der folgende Code ordnet die Spalten des Modells den Widgets namens mySpinBox
, myLineEdit
und myCountryChooser
zu:
QDataWidgetMapper *mapper = new QDataWidgetMapper; mapper->setModel(model); mapper->addMapping(mySpinBox, 0); mapper->addMapping(myLineEdit, 1); mapper->addMapping(myCountryChooser, 2); mapper->toFirst();
Nach dem Aufruf von toFirst() zeigt mySpinBox
den Wert 1
, myLineEdit
zeigt Qt Norway
und myCountryChooser
zeigt Oslo
an. Die Navigationsfunktionen toFirst(), toNext(), toPrevious(), toLast() und setCurrentIndex() können verwendet werden, um im Modell zu navigieren und die Widgets mit Inhalten aus dem Modell zu aktualisieren.
Die Funktion setRootIndex() ermöglicht es, ein bestimmtes Element in einem Modell als Wurzelindex anzugeben - Kinder dieses Elements werden den entsprechenden Widgets in der Benutzeroberfläche zugeordnet.
QDataWidgetMapper unterstützt zwei Submit-Policies, AutoSubmit
und ManualSubmit
. AutoSubmit
aktualisiert das Modell, sobald das aktuelle Widget den Fokus verliert, ManualSubmit
aktualisiert das Modell erst, wenn submit() aufgerufen wird. ManualSubmit
ist nützlich, wenn ein Dialog angezeigt wird, der den Benutzer alle Änderungen abbrechen lässt. Auch andere Ansichten, die das Modell anzeigen, werden nicht aktualisiert, bis der Benutzer alle seine Änderungen abgeschlossen hat und abschickt.
Beachten Sie, dass QDataWidgetMapper externe Änderungen mitverfolgt. Wenn der Inhalt des Modells in einem anderen Modul der Anwendung aktualisiert wird, werden die Widgets ebenfalls aktualisiert.
Siehe auch QAbstractItemModel und QAbstractItemDelegate.
Dokumentation der Mitgliedstypen
enum QDataWidgetMapper::SubmitPolicy
Diese Aufzählung beschreibt die möglichen Übermittlungsrichtlinien, die QDataWidgetMapper unterstützt.
Konstante | Wert | Beschreibung |
---|---|---|
QDataWidgetMapper::AutoSubmit | 0 | Immer wenn ein Widget den Fokus verliert, wird der aktuelle Wert des Widgets auf das Elementmodell gesetzt. |
QDataWidgetMapper::ManualSubmit | 1 | Das Modell wird nicht aktualisiert, bis submit() aufgerufen wird. |
Dokumentation der Eigenschaft
currentIndex : int
Diese Eigenschaft enthält die aktuelle Zeile oder Spalte
Die Widgets werden mit Daten aus der Zeile unter index gefüllt, wenn die Ausrichtung horizontal ist (Standard), andernfalls mit Daten aus der Spalte unter index.
Zugriffsfunktionen:
int | currentIndex() const |
virtual void | setCurrentIndex(int index) |
Benachrichtigungssignal:
void | currentIndexChanged(int index) |
Siehe auch setCurrentModelIndex(), toFirst(), toNext(), toPrevious(), und toLast().
orientation : Qt::Orientation
Diese Eigenschaft enthält die Ausrichtung des Modells
Wenn die Ausrichtung Qt::Horizontal ist (der Standard), wird ein Widget einer Spalte eines Datenmodells zugeordnet. Das Widget wird mit den Daten des Modells aus seiner zugeordneten Spalte und der Zeile, auf die currentIndex() zeigt, gefüllt.
Verwenden Sie Qt::Horizontal für tabellarische Daten, die wie folgt aussehen:
1 | Qt Norwegen | Oslo |
2 | Qt Australien | Brisbane |
3 | Qt USA | Silicon Valley |
4 | Qt China | Peking |
5 | Qt Deutschland | Berlin |
Wenn die Orientierung auf Qt::Vertical gesetzt ist, wird ein Widget einer Zeile zugeordnet. Der Aufruf von setCurrentIndex() wird die aktuelle Spalte ändern. Das Widget wird mit den Daten des Modells aus seiner zugeordneten Zeile und der Spalte, auf die currentIndex() zeigt, gefüllt.
Verwenden Sie Qt::Vertical für tabellarische Daten, die wie folgt aussehen:
1 | 2 | 3 | 4 | 5 |
Qt Norwegen | Qt Australien | Qt USA | Qt China | Qt Deutschland |
Oslo | Brisbane | Silicon Valley | Peking | Berlin |
Durch die Änderung der Ausrichtung werden alle bestehenden Zuordnungen gelöscht.
Zugriffsfunktionen:
Qt::Orientation | orientation() const |
void | setOrientation(Qt::Orientation aOrientation) |
submitPolicy : SubmitPolicy
Diese Eigenschaft enthält die aktuelle Übermittlungsrichtlinie
Wird die aktuelle Übermittlungsrichtlinie geändert, werden alle Widgets auf die aktuellen Daten des Modells zurückgesetzt.
Zugriffsfunktionen:
QDataWidgetMapper::SubmitPolicy | submitPolicy() const |
void | setSubmitPolicy(QDataWidgetMapper::SubmitPolicy policy) |
Dokumentation der Mitgliedsfunktionen
[explicit]
QDataWidgetMapper::QDataWidgetMapper(QObject *parent = nullptr)
Konstruiert einen neuen QDataWidgetMapper mit dem übergeordneten Objekt parent. Standardmäßig ist die Ausrichtung horizontal und die Übermittlungsrichtlinie lautet AutoSubmit
.
Siehe auch setOrientation() und setSubmitPolicy().
[virtual noexcept]
QDataWidgetMapper::~QDataWidgetMapper()
Zerstört das Objekt.
void QDataWidgetMapper::addMapping(QWidget *widget, int section)
Fügt ein Mapping zwischen einem widget und einem section aus dem Modell hinzu. section ist eine Spalte im Modell, wenn die Ausrichtung horizontal ist (Standard), ansonsten eine Zeile.
Für das folgende Beispiel nehmen wir ein Modell myModel
an, das zwei Spalten hat: Die erste Spalte enthält die Namen der Personen in einer Gruppe, die zweite Spalte enthält ihr Alter. Die erste Spalte wird auf QLineEdit nameLineEdit
abgebildet, die zweite auf QSpinBox ageSpinBox
:
QDataWidgetMapper *mapper = new QDataWidgetMapper; mapper->setModel(myModel); mapper->addMapping(nameLineEdit, 0); mapper->addMapping(ageSpinBox, 1);
Anmerkungen:
- Wenn die widget bereits einem Abschnitt zugeordnet ist, wird die alte Zuordnung durch die neue ersetzt.
- Es sind nur Eins-zu-Eins-Zuordnungen zwischen Abschnitten und Widgets zulässig. Es ist nicht möglich, einen einzelnen Abschnitt mehreren Widgets zuzuordnen oder ein einzelnes Widget mehreren Abschnitten zuzuordnen.
Siehe auch removeMapping(), mappedSection(), und clearMapping().
void QDataWidgetMapper::addMapping(QWidget *widget, int section, const QByteArray &propertyName)
Im Wesentlichen dasselbe wie addMapping(), jedoch mit der zusätzlichen Möglichkeit, die zu verwendende Eigenschaft durch Angabe von propertyName anzugeben.
Siehe auch addMapping().
void QDataWidgetMapper::clearMapping()
Löscht alle Mappings.
Siehe auch addMapping() und removeMapping().
[signal]
void QDataWidgetMapper::currentIndexChanged(int index)
Dieses Signal wird ausgegeben, nachdem sich der aktuelle Index geändert hat und alle Widgets mit neuen Daten bestückt wurden. index ist der neue aktuelle Index.
Hinweis: Benachrichtigungssignal für die Eigenschaft currentIndex.
Siehe auch currentIndex() und setCurrentIndex().
QAbstractItemDelegate *QDataWidgetMapper::itemDelegate() const
Gibt den aktuellen Elementdelegierten zurück.
Siehe auch setItemDelegate().
QByteArray QDataWidgetMapper::mappedPropertyName(QWidget *widget) const
Gibt den Namen der Eigenschaft zurück, die bei der Zuordnung von Daten zu der angegebenen widget verwendet wird.
Siehe auch mappedSection(), addMapping(), und removeMapping().
int QDataWidgetMapper::mappedSection(QWidget *widget) const
Gibt den Bereich zurück, dem das widget zugeordnet ist, oder -1, wenn das Widget nicht zugeordnet ist.
Siehe auch addMapping() und removeMapping().
QWidget *QDataWidgetMapper::mappedWidgetAt(int section) const
Gibt das Widget zurück, das unter section abgebildet ist, oder 0, wenn kein Widget in diesem Abschnitt abgebildet ist.
Siehe auch addMapping() und removeMapping().
QAbstractItemModel *QDataWidgetMapper::model() const
Gibt das aktuelle Modell zurück.
Siehe auch setModel().
void QDataWidgetMapper::removeMapping(QWidget *widget)
Entfernt das Mapping für die angegebene widget.
Siehe auch addMapping() und clearMapping().
[slot]
void QDataWidgetMapper::revert()
Füllt alle Widgets mit den aktuellen Daten des Modells neu auf. Alle nicht übermittelten Änderungen gehen dabei verloren.
Siehe auch submit() und setSubmitPolicy().
QModelIndex QDataWidgetMapper::rootIndex() const
Gibt den aktuellen Wurzelindex zurück.
Siehe auch setRootIndex().
[slot]
void QDataWidgetMapper::setCurrentModelIndex(const QModelIndex &index)
Setzt den aktuellen Index auf die Zeile des index, wenn die Ausrichtung horizontal ist (die Vorgabe), andernfalls auf die Spalte des index.
Ruft intern setCurrentIndex() auf. Dieser Convenience Slot kann mit dem Signal currentRowChanged() oder currentColumnChanged() einer anderen Ansicht selection model verbunden werden.
Das folgende Beispiel zeigt, wie alle Widgets mit neuen Daten aktualisiert werden, wenn sich die Auswahl eines QTableView namens myTableView
ändert:
QDataWidgetMapper *mapper = new QDataWidgetMapper; connect(myTableView->selectionModel(), &QItemSelectionModel::currentRowChanged, mapper, &QDataWidgetMapper::setCurrentModelIndex);
Siehe auch currentIndex().
void QDataWidgetMapper::setItemDelegate(QAbstractItemDelegate *delegate)
Setzt den Elementdelegaten auf delegate. Der Delegat wird verwendet, um Daten aus dem Modell in das Widget und aus dem Widget in das Modell zu schreiben, unter Verwendung von QAbstractItemDelegate::setEditorData() und QAbstractItemDelegate::setModelData().
Jeder existierende Delegat wird entfernt, aber nicht gelöscht. QDataWidgetMapper übernimmt nicht den Besitz von delegate.
Der Delegat entscheidet auch, wann er Daten anwendet und wann er den Editor ändert, indem er QAbstractItemDelegate::commitData() und QAbstractItemDelegate::closeEditor() verwendet.
Warnung: Sie sollten nicht die gleiche Instanz eines Delegaten zwischen Widget Mappern oder Views teilen. Dies kann zu falschem oder unintuitivem Editierverhalten führen, da jeder View, der mit einem gegebenen Delegaten verbunden ist, das closeEditor() Signal empfangen kann und versucht, auf einen bereits geschlossenen Editor zuzugreifen, ihn zu ändern oder zu schließen.
Siehe auch itemDelegate().
void QDataWidgetMapper::setModel(QAbstractItemModel *model)
Setzt das aktuelle Modell auf model. Wenn ein anderes Modell gesetzt war, werden alle Zuordnungen zu diesem alten Modell gelöscht.
Siehe auch model().
void QDataWidgetMapper::setRootIndex(const QModelIndex &index)
Setzt das Wurzelelement auf index. Dies kann verwendet werden, um einen Zweig eines Baumes anzuzeigen. Übergeben Sie einen ungültigen Modellindex, um den obersten Zweig anzuzeigen.
Siehe auch rootIndex().
[slot]
bool QDataWidgetMapper::submit()
Übermittelt alle Änderungen von den zugeordneten Widgets an das Modell.
Für jeden zugeordneten Abschnitt liest der Item-Delegierte den aktuellen Wert aus dem Widget und setzt ihn im Modell. Schließlich wird die Methode submit() des Modells aufgerufen.
Gibt true
zurück, wenn alle Werte übermittelt wurden, andernfalls false.
Hinweis: Bei Datenbankmodellen kann QSqlQueryModel::lastError() verwendet werden, um den letzten Fehler abzurufen.
Siehe auch revert() und setSubmitPolicy().
[slot]
void QDataWidgetMapper::toFirst()
Füllt die Widgets mit Daten aus der ersten Zeile des Modells, wenn die Ausrichtung horizontal ist (Standard), ansonsten mit Daten aus der ersten Spalte.
Dies ist gleichbedeutend mit dem Aufruf von setCurrentIndex(0)
.
Siehe auch toLast() und setCurrentIndex().
[slot]
void QDataWidgetMapper::toLast()
Füllt die Widgets mit Daten aus der letzten Zeile des Modells, wenn die Ausrichtung horizontal ist (Standard), ansonsten mit Daten aus der letzten Spalte.
Ruft intern setCurrentIndex() auf.
Siehe auch toFirst() und setCurrentIndex().
[slot]
void QDataWidgetMapper::toNext()
Füllt die Widgets mit Daten aus der nächsten Zeile des Modells, wenn die Ausrichtung horizontal ist (Standard), ansonsten mit Daten aus der nächsten Spalte.
Ruft intern setCurrentIndex() auf. Tut nichts, wenn es keine nächste Zeile im Modell gibt.
Siehe auch toPrevious() und setCurrentIndex().
[slot]
void QDataWidgetMapper::toPrevious()
Füllt die Widgets mit Daten aus der vorherigen Zeile des Modells, wenn die Ausrichtung horizontal ist (Standardeinstellung), ansonsten mit Daten aus der vorherigen Spalte.
Ruft intern setCurrentIndex() auf. Führt nichts aus, wenn es keine vorherige Zeile im Modell gibt.
Siehe auch toNext() und setCurrentIndex().
© 2025 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.