[gelöst] treeView Daten in Zelle ändern (setData)

Alles rund um die Programmierung mit Qt
Antworten
24dan
Beiträge: 274
Registriert: 26. Juni 2006 14:15
Wohnort: Hamburg

[gelöst] treeView Daten in Zelle ändern (setData)

Beitrag von 24dan »

Hi,
ich verwende die Klassen des Qt Simple Tree Model Example in meinem Programm. Die Datensätze sind ja alle als read-only in das model eingefügt worden.

Ich habe jetzt einfach diese Funktion hinzufügen wollen damit mein Model Änderungen aufnehmen kann.

Code: Alles auswählen

bool TreeModel::setData(const QModelIndex &index,
                              const QVariant &value, int role)
{
    if (index.isValid() && role == Qt::EditRole) {
// von mir hinzugefügt 
        QAbstractItemModel::setData(index,value.toString());
        emit dataChanged(index, index);
        return true;
    }
    return false;
}
Leider werden meine Daten jedoch nicht im model übernommen und auch entsprechend im View nicht angezeigt.
Zuletzt geändert von 24dan am 14. März 2010 19:45, insgesamt 1-mal geändert.
"Der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott."
(W. Heisenberg)
Chris81T
Beiträge: 82
Registriert: 4. Mai 2008 00:06
Wohnort: Urbar

Beitrag von Chris81T »

Code: Alles auswählen

QAbstractItemModel::setData(index,value.toString());
Das macht leider an dieser Stelle keinen Sinn. Schau mal im Assistant nach, was diese implementierte Funktion in der Klasse macht.

Und dann schau als nächstes dir erneut das Beispiel an. Dort in der Modelklasse die data Funktion.

Stichwort hier ist auf dem ModelIndex den internalPointer() anzusprechen ;)

Wenn du darüber deine Daten bekommst, kannst du diese selbstverständlich auch setzen :)
24dan
Beiträge: 274
Registriert: 26. Juni 2006 14:15
Wohnort: Hamburg

Beitrag von 24dan »

Vielen Dank für die Hilfe.

Ich habe die setData Geschichte nicht begriffen.
Müsste ich ein temp TreeItem anlegen und mit den Daten ModelIndex, Pointer und Wert füllen und gegen das alte "tauschen" überschreiben?
"Der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott."
(W. Heisenberg)
Chris81T
Beiträge: 82
Registriert: 4. Mai 2008 00:06
Wohnort: Urbar

Beitrag von Chris81T »

Okay,

also du verwendest ja den Grundgedanken des genannten Beispiels. Dieses Beispiel implementiert sich ein eigenes Model (event. auch eigenen View, kenn das Bsp nun nicht auswendig).
Und ganz wichtig, es verwendet seine eigene Item-struktur, welche die Daten "kennt".

Folgender Ansatz gilt ja immer beim Interview Designpattern:

Ein View fragt benötigte Daten an, dazu wird das Model gefragt:
- Wie viele Zeilen hast du?
- Wie viele Spalten hast du?
- Welche Daten sollen für Zeile X Spalte Y angezeigt werden?
- ...

Das Model widerum kennt seine Items und kann dementsprechend die Fragen des Views beantworten. Die Items wiederum kennen ihre Daten.

Der View, sowie das Model kommunizieren mit QModelIndex Objekten (die sind kurzlebig!). Auf gut Deutsch: Das View indiziert mit QModelIndexen deine Items. Und so kommt's, wenn du was schreiben willst, dass das View dem Model mit setData ( Value und ModelIndex ) sagt, ich will Daten schreiben.
Über den QModelIndex hast du die Möglichkeit, dein Item ausfindig zu machen, um darin (mit zB. geeigneter FUnktion) den Value zu setzen. Und deswegen mein Hinweis auf die data() Funktion, weil du es da eigentlich vorgemacht bekommst, wie du an dein Item rankommst. Darüber hinaus macht es auch Sinn, sich die anderen FUnktionen mal anzuschauen um zu erkennen, wo das Item einem QModelIndex zugeordnet wird!

Viel Erfolg!

PS: Ja, man muss es erst einmal kapiert haben, ist ein wenig komplex, das Konstrukt 8)
24dan
Beiträge: 274
Registriert: 26. Juni 2006 14:15
Wohnort: Hamburg

Beitrag von 24dan »

Vielen Dank für die ausführliche und verständliche Antwort.
Ich werde mir die data methode nochmals ansehen und dann melde ich mich wieder....
"Der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott."
(W. Heisenberg)
24dan
Beiträge: 274
Registriert: 26. Juni 2006 14:15
Wohnort: Hamburg

Beitrag von 24dan »

Hi, hast Du eigentlich das mit "beginRemoveRows"/"endRem hinbekommen?

Also ich habe mir die data() nochmals angesehen und schnalle nix:

Code: Alles auswählen


QVariant TreeModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();

    if (role != Qt::DisplayRole)
        return QVariant();

    TreeItem *item = static_cast<TreeItem*>(index.internalPointer());

    return item->data(index.column());
}
Wie teile ich den dem Model neben den ModelIndex, was ja dem Ort meiner Gewünschten Veränderung der Daten betrifft auch den WERT mit den ich dort statt des bisherigen haben will?
"Der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott."
(W. Heisenberg)
24dan
Beiträge: 274
Registriert: 26. Juni 2006 14:15
Wohnort: Hamburg

Beitrag von 24dan »

Wer sucht der findet...

Hier die Lösung....

Code: Alles auswählen

bool TreeModel::setData(const QModelIndex &index, const QVariant &value,
                        int role)
{
    if (role != Qt::EditRole)
        return false;

    TreeItem *item = getItem(index);
    bool result = item->setData(index.column(), value);

    if (result)
        emit dataChanged(index, index);

    return result;
}
Also tatsächlich ein neues TreeItem anlegen und setData(die Spalte, und den Wert) geben. Verstanden habe ich das noch nicht...

... das Item wird einfach ÜBERSCHRIEBEN??? :roll:
"Der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott."
(W. Heisenberg)
Antworten