QDataWidgetMapper

Alles rund um die Programmierung mit Qt
Antworten
wol
Beiträge: 12
Registriert: 28. August 2009 14:04

QDataWidgetMapper

Beitrag von wol »

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!
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Das mit dem EditRole ist richtig, da er ja die Daten fürs bearbeiten will. (Im allgemeinen gibt man eh die gleichen Daten für die EditRole und die DisplayRole zurück). Wie schaut die SubmitPolicy vom QDataWidgetMapper aus?
wol
Beiträge: 12
Registriert: 28. August 2009 14:04

Beitrag von wol »

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 :-( )
Baz
Beiträge: 67
Registriert: 22. August 2007 14:21

Beitrag von Baz »

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.
wol
Beiträge: 12
Registriert: 28. August 2009 14:04

Beitrag von wol »

Hast du da einen LInk auf den Bugreport?
wol
Beiträge: 12
Registriert: 28. August 2009 14:04

Beitrag von wol »

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