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
QTableView mit QAbstractItemModel
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 ...
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 ...
Aber klar doch.. einfach mittels signals der View die Aenderungen mitteilen:Gibt es eine Möglichkeit das view zu updaten?
http://doc.trolltech.com/4.4/qabstracti ... ataChangedDas 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 ... outChangedWenn sich die Anzahl der Spalten im Model verringert, sagen wir mal von 9 auf 5.
hth..
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
ausgelößt, was dann wiederum die aktuelle Darstellung durch das View bewirkt.
eine Frage habe ich jedoch noch zu folgenden Funktionen:
Dazu mal mein Code:
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]
@ 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();
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 ()
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üsste ich innerhalb von den begin... und end... Funktionen mehr machen als die Membervariable zu aktualisieren?
[/code]
Wozu? Bei columnCount() koenntest du doch einfach m_buffer.columnCount(); zurueckgeben..m_colCount ist einen Membervariable, die die Anzahl der Spalten ernthält. Wird auch z.b. bei columnCount() zurückgegeben.
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....Müsste ich innerhalb von den begin... und end... Funktionen mehr machen als die Membervariable zu aktualisieren?
@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 ...
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 ...