[gelöst] [QT4.*] Model & View --> Löschen von sg. Zei

Alles rund um die Programmierung mit Qt
Antworten
Esleborn
Beiträge: 265
Registriert: 27. Januar 2005 01:23
Wohnort: Baden-Würtenberg
Kontaktdaten:

[gelöst] [QT4.*] Model & View --> Löschen von sg. Zei

Beitrag von Esleborn »

hi,
ich hab mal wieder ein Problem mit den Model&View Zeugs...

es geht um ein Model das durch ein QTreeView, ein QListView und ein selbst geschriebenes View veranschaulicht wird.
Insgesamt entsteht eine Ansicht wie man sie vom WindowsExplorer (oder besserem) gewöhnt ist, nur dass es eben nicht die Ansicht auf Dateien und Ordner, sondern auf eine eigene Datenstruktur darstellt. (Mit Boxen (~Ordnern) und Items (~Dateien))

Soweit tut alles wunderbar, ansehen der Daten, einfügen von neuen Daten, bearbeiten der Daten, context Menüs je nachdem worauf geklickt wurde, usw alles super... nur eins macht einfach dauerhaft Probleme... das entfernen von Daten...
Es soll schlich und ergreifend eine Box gelöscht werden.

Der Code dafür ist:

Code: Alles auswählen

class C_HierachyModel ...
{
...
  C_DataItem *mp_rootItem;

// Die Folgende Funktion wird korrekt aufgrufen, die Indexes stimmen
bool C_HierachyModel::Delete ( const QModelIndexList &fl_indeces )
{
/* Nachfragen ob wirklich löschen usw */
    foreach ( QModelIndex index, fl_indeces )
    {
      if ( !index.isValid ( ) )
        continue;
      removeRow ( index.row ( ), index.parent ( ) );
    }
}


bool C_HierachyModel::removeRows ( int f_row, int f_count, const QModelIndex &f_parent )
{
  C_DataItem * p_parentItem ( NULL );
  QList < C_DataItem* > lp_dataItems;
  
  if ( f_parent.isValid ( ) )
    p_parentItem = static_cast < C_DataItem* > ( f_parent.internalPointer ( ) );
  else
    p_parentItem = mp_rootItem;

  beginRemoveRows ( f_parent, f_row, f_row + f_count - 1 );
    for ( int rowCounter ( f_row ); rowCounter < f_row + f_count; ++rowCounter )
      p_parentItem->Child ( rowCounter )->DeleteObject ( );
  endRemoveRows ( );

  return true;
}
C_DataItem ist die Schnittstellenklasse für den Zugriff auf meine Datenstrukturen. die Funktion Child ( ... ) stellt die korrekte Struktur zur Verfügung und DeleteObject löscht diese.
Es funktioniert alles bis direkt nach "endRemoveRows ( )", dann wird ein Fehler angezeigt, weil von dem QModelIndex, das im Moment gelöscht wurde, der Parent abgefragt wird. Das verursacht natürlich einen Fehler, da die Datenstrukturen dafür bereits gelöscht wurden... einer ne Idee was falsch ist?


thx

Elgrimm Esleborn
Zuletzt geändert von Esleborn am 4. Februar 2006 00:20, insgesamt 1-mal geändert.
Glaube an eine Lösung, nur dann kannst du auch eine finden.
Esleborn
Beiträge: 265
Registriert: 27. Januar 2005 01:23
Wohnort: Baden-Würtenberg
Kontaktdaten:

Beitrag von Esleborn »

erweitert man die parent ( ) Funktion um eine Abfrage, die meiner Meinung nach eigentlich keinen Sinn macht, dann kommt der Rechner weiter... es kommt eine "Unbehandelte Ausnahme" in der realloc.c (?wtf?), aber ignoriert man diese gehts weiter....

Kann mir das einer erklären?
thx

E.E.

PS: Die unsinnige Abfrage ist zu kontrollieren, ob das parentItem NULL ist, was aber meiner Meinung nach keinen Sinn macht, da dies nur beim RootItem der Fall ist. Dieses wird aber ausgeschlossen, da kontrolliert wird, ob der Index "!isValid ( )" ist (wie auch immer man das jetzt in einen deutschen Satz packen könnte... :lol:)
PPS: Tip: Vermeidet dass Model&View Zeugs nach Möglichkeit, außer wenn ihr viel Zeit habt....
Glaube an eine Lösung, nur dann kannst du auch eine finden.
seneca
Beiträge: 23
Registriert: 6. Januar 2006 09:57

Beitrag von seneca »

Vielleicht könnte die Klassendefinition von C_DataItem zusammen mit dem Destructor- und dem DeleteObject-Code hier weiterhelfen.
Esleborn
Beiträge: 265
Registriert: 27. Januar 2005 01:23
Wohnort: Baden-Würtenberg
Kontaktdaten:

Beitrag von Esleborn »

ok:

Code: Alles auswählen

class C_DataItem
{
public:
   enum
   {
   __NAME__ = 0,   __SHORT_NAME__,   __LONG_NAME__,   __ICON__
   };

   C_DataItem   ( QPC_AbstractHierachyObject fp_object );
   ~C_DataItem   ( );

   // ACHTUNG: Das C_DataItem wird mit gelöscht!
   void   DeleteObject   ( );

   bool   AppendChild   ( C_DataItem *fp_child, bool f_copy = false );

   C_DataItem *   Child   ( int f_row );
   int   Childs   ( ) const;
   int   Columns   ( ) const;
   QVariant   Data   ( int f_column ) const;
   bool   Data   ( int f_column, QVariant f_data );
   int   Row   ( ) const;
   C_DataItem *   Parent   ( );

   bool   IsBox   ( ) const;
   bool   IsItem   ( ) const;

   QPC_AbstractHierachyObject   HierachyObject   ( );
   const QPC_AbstractHierachyObject   HierachyObject   ( ) const;

private:
   QPC_AbstractHierachyObject   mp_object;
};

C_DataItem::~C_DataItem ( )
{
   if ( !mp_object.isNull ( ) )
   {
      mp_object->DataItem ( NULL );
      mp_object = NULL;
   }
}

void C_DataItem::DeleteObject ( )
{
   if ( !mp_object.isNull ( ) )
   {
      delete mp_object;
      mp_object = NULL;
   }
}
QPC_AbstractHierachyObject ist ein QPointer auf ein C_AbstractHierachyObject. Der Destruktur dieser HierachyObjecte löscht das C_DataItem, was einwandfrei funktioniert.
Data, IsBox, IsItem, Parent, usw holen den Result aus dem HierachyObjecte, kontrollieren aber jeweils davor ob das object NULL ist...
Glaube an eine Lösung, nur dann kannst du auch eine finden.
Esleborn
Beiträge: 265
Registriert: 27. Januar 2005 01:23
Wohnort: Baden-Würtenberg
Kontaktdaten:

Beitrag von Esleborn »

naja jetzt tut es... lag anscheinend in der etwas komischen Datenstruktur, die irgendwie falsch gelöscht hat... jedenfalls ist der Fehler weg, seit ich sie nne bisle "gesäubert" habe...
Glaube an eine Lösung, nur dann kannst du auch eine finden.
Antworten