Seite 1 von 1

QTableView mit QAbstractItemModel

Verfasst: 26. Januar 2009 16:07
von MBex
Hallo,

ich habe ein Problem mit meiner Model View Implementation.

1.
Gibt es eine Möglichkeit das view zu updaten?
Das Problem ist, dass wenn sich der Inhalt des Models ändert, das View nicht sofort alle Änderungen bezüglich der Spaltenüberschriften aktualisiert. Erst wenn ich die Maus über jeden Überschrifteneintrag bewege wird der korrekte Inhalt angezeigt.
Mit update() von QWidget habe ich es bereits versucht.

2.
Wenn sich die Anzahl der Spalten im Model verringert, sagen wir mal von 9 auf 5. Dann bleiben 3 Spalten leer zurück, anstatt das sie ganz verschwinden.
Ich dachte, das sich das View komplett an das Model anpasst.
Die funktion columnCount() liefert den korrekten Wert zurück.
Muss ich da noch etwas "von Hand" beim View löschen? Wenn ja würde mich das doch sehr wundern.

Hoffe mir kann jemand helfen.
Schonmal danke im Vorraus.

mfg. Marco

Verfasst: 26. Januar 2009 16:55
von RHBaum
1. natuerlich

void beginInsertColumns ( const QModelIndex & parent, int first, int last )
void beginInsertRows ( const QModelIndex & parent, int first, int last )
void beginRemoveColumns ( const QModelIndex & parent, int first, int last )
void beginRemoveRows ( const QModelIndex & parent, int first, int last )

void endInsertColumns ()
void endInsertRows ()
void endRemoveColumns ()
void endRemoveRows ()

wenn du daten hinzufuegst und loeschst .... das model benachrichtigt das view intern ...

Aendern sich die daten in einem bereich, ist das signal.
void dataChanged ( const QModelIndex & topLeft, const QModelIndex & bottomRight )

und die brachiale loesung ....
void reset ()

Laesst sich das Model view gebilde neu synchronisieren, also nen komplettes neuzeichnen ...

2. siehe Punkt 1 !

Ciao ...

Verfasst: 26. Januar 2009 16:56
von solarix
Gibt es eine Möglichkeit das view zu updaten?
Aber klar doch.. einfach mittels signals der View die Aenderungen mitteilen:
Das Problem ist, dass wenn sich der Inhalt des Models ändert, das View nicht sofort alle Änderungen bezüglich der Spaltenüberschriften aktualisiert.
http://doc.trolltech.com/4.4/qabstracti ... ataChanged
Wenn sich die Anzahl der Spalten im Model verringert, sagen wir mal von 9 auf 5.
http://doc.trolltech.com/4.4/qabstracti ... outChanged

hth..

Verfasst: 27. Januar 2009 08:24
von MBex
vielen Dank ;-)

@ RHBaum

die begin... und end... Funktionen hatte ich schon verwendet, doch bringt dies alleine wohl nicht den gewünschten Erfolg.

Immer wenn sich jetzt die Header ändern wird

Code: Alles auswählen

emit layoutAboutToBeChanged();

...
emit headerDataChanged(Qt::Horizontal, 0, m_colCount -1);
emit layoutChanged();
ausgelößt, was dann wiederum die aktuelle Darstellung durch das View bewirkt.

eine Frage habe ich jedoch noch zu folgenden Funktionen:

Code: Alles auswählen

void beginInsertColumns ( const QModelIndex & parent, int first, int last ) 
void beginRemoveColumns ( const QModelIndex & parent, int first, int last) 
void endInsertColumns () 
void endRemoveColumns () 
Dazu mal mein Code:

Code: Alles auswählen

   int nColCount = m_buffer.columnCount();
   if (nColCount > m_colCount)
   {
      beginInsertColumns(QModelIndex(), m_colCount, /*m_colCount + */ nColCount - 1);
      m_colCount = nColCount;
      endInsertColumns();
   }
   else if (nColCount < m_colCount)
   {
      beginRemoveColumns(QModelIndex(), nColCount, m_colCount);
      m_colCount = nColCount;
      endRemoveColumns();
   }
m_colCount ist einen Membervariable, die die Anzahl der Spalten ernthält. Wird auch z.b. bei columnCount() zurückgegeben.

Müsste ich innerhalb von den begin... und end... Funktionen mehr machen als die Membervariable zu aktualisieren?
[/code]

Verfasst: 27. Januar 2009 08:48
von solarix
m_colCount ist einen Membervariable, die die Anzahl der Spalten ernthält. Wird auch z.b. bei columnCount() zurückgegeben.
Wozu? Bei columnCount() koenntest du doch einfach m_buffer.columnCount(); zurueckgeben..
Müsste ich innerhalb von den begin... und end... Funktionen mehr machen als die Membervariable zu aktualisieren?
ja klar.. natürlich die Kolonnen an der geforderten Stelle in deinen internen Datenbuffer (bei dir anscheinend "m_buffer") einfügen... schliesslich fragt ja hinterher die View die Daten mittels data(..) ab... und da sollten diese dann schon in m_buffer verfügbar sein....

Verfasst: 27. Januar 2009 11:07
von RHBaum
@MBex

ups ja, wollt nur zeigen das du im Model das View benachrichtigen musst, bei solchen anderungen.

Bei den Modells die man selber erstellt hat man eigentlich nur 2 Grundlegende Typen ....

Welche die die Daten selber halten und bearbeiten und welche die die Anfragen nur weiterleiten, also quasi als Adapter arbeiten.
Ok, gecashte dinger sind dann wieder der mittelweg.

Wenn die daten selber haelst, kannst die strukturen selber fragen, wie "voll" sie grad sind.
Die QListen, also diese Zwitter Container die weder vector noch liste sind, eignen sich besonders gut als Container fuer.
Performanter wie nen vector (beim einfuegen) und trotzdem komfortablen index zugriff.

Ciao ...