QTableView mit QAbstractItemModel

Alles rund um die Programmierung mit Qt
Antworten
MBex
Beiträge: 17
Registriert: 24. November 2007 11:36

QTableView mit QAbstractItemModel

Beitrag 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
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag 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 ...
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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..
MBex
Beiträge: 17
Registriert: 24. November 2007 11:36

Beitrag 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]
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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....
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag 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 ...
Antworten