Hallo,
ich versuche gerade den QDataWidgetMapper zu nützen. Aber leider noch ohne Erfolg. Das Problem ist, dass die Sachen die ich an der GUI eintrage einfach nie im Model landen, dessen Methoden scheinen nie aufgerufen zu werden.
Mein Code in Ausschnitten:
Im Widget-Konstruktor:
mapping = new QDataWidgetMapper(this);
mapping->setModel(mitglied);
mapping->setOrientation(Qt::Vertical);
mapping->setItemDelegate(new QItemDelegate(mapping));
mitgliedschaftLayout->addWidget(factory->constructVornameLabel(), 2, 0);
vornameLineEdit = factory->constructVornameLineEdit();
mitgliedschaftLayout->addWidget(vornameLineEdit, 2, 1);
mapping->addMapping(vornameLineEdit, Mitglied::VORNAME);
mapping->toFirst();
Wobei mitglied ein (über eine Indirektion) von QAbstractListModel abgeleitetes, selbst geschriebenes Model ist. Überschrieben ist:
rowCount
data()
setData()
headerData()
flags()
Bei den letzteren drei habe ich überprüft dass sie in meinem Code nie aufgerufen werden. Was ich verifizieren konnte ist dass die section-Angaben dauerhaft gespeichert werden, also das Mapping wird anscheinend nicht zurückgesetzt.
headerData und flags:
QVariant Mitglied::headerData(int section, Qt::Orientation orientation, int role) {
return QVariant(); // TODO: Maybe generate implementation.
}
Qt::ItemFlags Mitglied::flags(const QModelIndex &index) {
Qt::ItemFlags flags = Persistent::flags(index);
flags |= Qt::ItemIsEditable;
return flags;
}
Die setData-Methode schließe ich aus, weil die wird ja nichtmal aufgerufen. Dafür wird data() aufgerufen, aber mit role EDIT_ROLE. Das Model ist mit dem Q_OBJECT-Makro definiert.
Sieht irgendwer einen Fehler in den Codeausschnitten? Oder, anders gefragt, was muss man alles tun um einen QDataWidgetMapper zusammen mit einem selbstdefinierten Model einzusetzen? Was sind da Fallstricke die man leicht mal vergisst?
Schonmal danke für alle Hinweise!
QDataWidgetMapper
Die ist auf QDataWidgetMapper::AutoSubmit. (eigentlich schon standardmäßig durch Konstruktor, jetzt aber sicherheitshalber auch noch manuell darauf gesetzt).
Daran dachte ich auch schon
Über Ideen wäre ich sehr dankbar, ansonsten habe ich mir jetzt mal den Qt-Quelltext runtergeladen, notfalls muss ich das eben debuggen
)
Daran dachte ich auch schon
Über Ideen wäre ich sehr dankbar, ansonsten habe ich mir jetzt mal den Qt-Quelltext runtergeladen, notfalls muss ich das eben debuggen
Also ich hatte damals auch Probleme mit dem DWM - ich hatte dann rausgefunden, dass es ein Problem des Models ist. Nutzt man nicht den manuellen Submit des Models (ich benutzte Tablemodels), klappt es nicht. Hab auch schon einen Bugreport abgegeben, wurde auch angenommen, aber den aktuellen Stand müsste ich mal nachschauen.
Hab mein Problem gelöst. Es waren in Wirklichkeit zwei Probleme:
Erstens: Bei meiner setData-Implementierung haben die const-Schlüsselwörter in der Methodensignatur gefehlt. Daher hat mein C++-Compiler die nicht als überschriebene Methode akzeptiert, sondern gedacht dass ich die neu implementiere. Folge: Keine dynamische Bindung, meine Methode wurde nie aufgerufen.
Zweitens: In data() hat die Prüfung auf die EditRole gefehlt, ich hab nur auf die DisplayRole geprüft. Daher hat mein model grundsätzlich immer leere QVariant() Instanzen zurückgegeben.
Erstens: Bei meiner setData-Implementierung haben die const-Schlüsselwörter in der Methodensignatur gefehlt. Daher hat mein C++-Compiler die nicht als überschriebene Methode akzeptiert, sondern gedacht dass ich die neu implementiere. Folge: Keine dynamische Bindung, meine Methode wurde nie aufgerufen.
Zweitens: In data() hat die Prüfung auf die EditRole gefehlt, ich hab nur auf die DisplayRole geprüft. Daher hat mein model grundsätzlich immer leere QVariant() Instanzen zurückgegeben.