Was Du Dich wohl fragen solltest ist, warum ist die data Methode const? Und (die eigentliche Frage), warum soll in der als const deklarierten Methode das this Objekt verändert werden (was Du ja tun möchtest, indem Du myBuffer verändern möchtest)? Grundsätzlich ist ja die Deklaration als const ein Hinweis, dass in dieser Methode das Objekt nicht verändert wird.
Die Antwort wird wohl lauten: weil Du eine Methode überschreibst, die const ist, richtig? Ich bin mir nicht sicher wie Dein Anwendungsfall ist, aber ich interpretiere das jetzt mal so, dass myBuffer quasi ein Cache ist. Nun könnte man argumentieren, dass durch die Änderung eines Caches die wesentlichen Eigenschaften Deines Objektes nicht wirklich verändert werden, wodurch ein Bruch der const-correctness zu vertreten wäre (man müsste dann natürlich sicher stellen, dass dieser "Cache" entsprechend invalidiert wird etc.). So richtig schön sauber ist es aber auf jeden Fall nicht, und manch einer würde Dir ganz doll auf die Finder hauen, wenn Du const-correctness ignorierst (mehr Informationen zu const-correctness und ein paar Gedanken, warum es eine feine Sache ist, darauf zu achten, findest Du hier:
http://www.parashift.com/c++-faq-lite/c ... tness.html).
So oder so, es gibt nun zwei wege, wie Du trotz des const-qualifiers der data Methode Deinen Buffer verändern kannst:
1. const_cast
Code: Alles auswählen
QVariant myModel::data(const QModelIndex &index, int role) const {
myModel* mutableThis = const_cast<myModel*>(this); // macht aus const myModel* ein myModel*
mutableThis->myBuffer->insert(....);
....
}
2. myBuffer mutable deklarieren.
Code: Alles auswählen
class myModel : public QAbstractItemModel {
...
private:
mutable QMap<QModelIndex, QMap <int,QVariant> > myBuffer; // das Schlüsselwort "mutable" bedeutet, dass dieser Member auch in const-Methoden verändert werden darf
};
Wie gesagt, die feine englische Art ist beides nicht gerade...