Seite 1 von 1

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

Verfasst: 28. Februar 2010 17:28
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.

Verfasst: 28. Februar 2010 21:43
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 :)

Verfasst: 28. Februar 2010 22:54
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?

Verfasst: 1. März 2010 07:14
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)

Verfasst: 3. März 2010 14:39
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....

Verfasst: 3. März 2010 22:22
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?

Verfasst: 3. März 2010 22:37
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: