QTreeView aktualisiert nicht richtig

Alles rund um die Programmierung mit Qt
Antworten
dhcase
Beiträge: 132
Registriert: 10. Juni 2006 20:38

QTreeView aktualisiert nicht richtig

Beitrag von dhcase »

Hi,
ich habe ein DomModel für XML-Daten. Wenn ich jetzt eine Tag mittels removeRow() aus meinem Model lösche, so wird das richtige Tag im DomDocument gelöscht, allerdings wird dies im TreeView nicht richtig angezeigt - dort wird immer das letzte Item gelöscht.
Ein Beispiel: Ich habe folgendes XML

Code: Alles auswählen

<CRM_Set>
    <class description="CRM Entity" type="E01" text="111111111" />
    <class description="CRM Entity" type="E01" text="222222222" />
    <class description="CRM Entity" type="E01" text="333333333" />
</CRM_Set>
Wenn ich jetzt das erste Element lösche, dann wird es aus dem DomDocument richtig entfernt, die View sieht allerdings so aus:
Bild
Es wird also im DomDocument das erste Element gelöscht, im TreeView aber das letzte.

Hier der Code:

Code: Alles auswählen

bool DomModel::removeRow(int row, const QModelIndex &parent)
{
	DomItem *parentItem;
	parentItem = static_cast<DomItem*>(parent.internalPointer());

	QDomNode parentNode = parentItem->parent()->node();
	QDomNode node = parentItem->node();

	beginRemoveRows(parent, row, row);
	
	parentNode.removeChild(node);

	endRemoveRows();

	return true;
}

Code: Alles auswählen

void MainWindow::deleteItem()
{
	DomItem *parentItem;
	QModelIndex index = view->currentIndex();
	parentItem = static_cast<DomItem*>(index.internalPointer());
	int row = model->rowCount(index);
	
	if(index.isValid())
	{
		model->removeRow(row, index);
		
	}
	//view->dataChanged(index, index);
	view->collapse(index.parent());
	view->expand(index.parent());
}
Woran liegt das??? Und gibt es noch eine andere Möglichkeit neu eingefügte oder gelöschte Elemente im View anzuzeigen (bzw. den View zu aktualisieren) als view->collapse() und view->expand()? Wenn ich ein neues Element einfüge, so wird dies nur durch eine kleine gestrichelte Line unter dem letzten Item dargestellt, erst nach collapse() und expand() wird das Item angezeigt!

Danke schonmal,
D.
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Du benutzt aber nicht zufällig schon Qt 4.2pre, oder? Weil da ist das so, weil Fehler.
dhcase
Beiträge: 132
Registriert: 10. Juni 2006 20:38

Beitrag von dhcase »

Ich benutze 4.1.3, werde aber im Laufe des Tages mal 4.1.4 testen, vielleicht liegts ja daran... hoffentlich...
dhcase
Beiträge: 132
Registriert: 10. Juni 2006 20:38

Beitrag von dhcase »

So, ich habe es jetzt mit Qt 4.1.4 getestet, das Ergebnis ist genau das gleiche. Hat jemand noch eine Idee, oder ist es evtl. doch ein Fehler in Qt?
jazzman
Beiträge: 1
Registriert: 9. Oktober 2006 13:06

Beitrag von jazzman »

Ich glaube nicht, dass das ein QT-Fehler ist!!

Ich hatte das gleiche Problem! Wahrscheinlich hast Du auch die Vorlage aus der QT-Doku benutzt. Mir fehlte da eine kleine aber feine Kleinigkeit, als ich das Model editierbar machen wollte.

In der DomItem-Klasse (so heißt sie im Beispiel) gibt es die child-Methode. Interessant ist folgende Zeile:

Code: Alles auswählen

...
childItems[i]=childItem;
...
Hier wird das childItem in eine Hash-Table eingefügt und muss beim Löschen aus dem Modell auch wieder aus selbiger entfernt werden.

Code: Alles auswählen

bool DomItem::removeChild(int row) {
  return childItems.remove(row);
}
Diese Methode rufst Du im DomModel in der removeRow()-Methode auf, nachdem Du den Knoten aus dem Modell gelöscht hast:

Code: Alles auswählen

...
parentNode.removeChild(node);  //Knoten aus DOM löschen
parentItem.removeChild(row);    //Knoten aus Hash-Table löschen
...
So hat's bei mir funktioniert.
dhcase
Beiträge: 132
Registriert: 10. Juni 2006 20:38

Beitrag von dhcase »

Hey jazzman, wenn das funktioniert, dann bist du mein persönlicher Held :D
Ich werde es morgen bei Gelegenheit mal testen!

Thx, D.
Antworten