ProxyModel und virtuelle Spalte
Verfasst: 6. Dezember 2008 22:11
Hi,
ich habe ein Model für eine TableView und ein Proxy (abgeleitet von QSortFilterProxyModel) um eine spezielle Sortierung der Daten vorzunehmen (d.h. ich habe lessThan() in meinem Proxy implementiert). Das alles funktioniert ganz gut und ModelTest meldet keine Fehler, weder für das Model selbst noch für den Proxy.
Nun aber mein Problem. Im Model existiert eine Spalte die einen Geld-Betrag. Ich möchte nun eine virtuelle Spalte hinzufügen (sprich im Proxy) die den aktuellen "Kontostand" anzeigt.
Einfach, dachte ich. Also implementierte ich zunächst im Proxy die Methoden index(), columnCount(), data() sowie mapToSource(). Für einen ersten Test erschienen mir die restlichen Methoden (setData(), ...) erst einmal unwichtig.
columnCount() habe ich wohl richtig implementiert, davon gehe ich zumindest aus. Probleme machen mir aber index() und mapToSource(). Wie auch immer. Egal was ich versuche. Entweder bekomme ich einen Crash beim starten der App, oder zumindest "sieht" alles einfach falsch aus (was sich besonders an der Selection zeigt). Ich weiss nun nicht recht weiter und bitte daher um eure Hilfe.
Hier mal der Code meines aktuellen Versuchs:
Vielen Dank,
Hilefoks
P.S: Der Code versucht zunächst nicht die weiter oben gezeigte Tabelle umzusetzen, sondern zunächst einfach nur eine virtuelle Spalte einzufügen. Daran scheitert es allerdings bereits.
ich habe ein Model für eine TableView und ein Proxy (abgeleitet von QSortFilterProxyModel) um eine spezielle Sortierung der Daten vorzunehmen (d.h. ich habe lessThan() in meinem Proxy implementiert). Das alles funktioniert ganz gut und ModelTest meldet keine Fehler, weder für das Model selbst noch für den Proxy.
Nun aber mein Problem. Im Model existiert eine Spalte die einen Geld-Betrag. Ich möchte nun eine virtuelle Spalte hinzufügen (sprich im Proxy) die den aktuellen "Kontostand" anzeigt.
Code: Alles auswählen
Vorher Nachher
1.1.2008 | 40 Euro 1.1.2008 | 40 Euro | 40 Euro
2.1.2008 | 10 Euro => 2.1.2008 | 10 Euro | 50 Euro
3.1.2008 | 30 Euro 3.1.2008 | 30 Euro | 80 EurocolumnCount() habe ich wohl richtig implementiert, davon gehe ich zumindest aus. Probleme machen mir aber index() und mapToSource(). Wie auch immer. Egal was ich versuche. Entweder bekomme ich einen Crash beim starten der App, oder zumindest "sieht" alles einfach falsch aus (was sich besonders an der Selection zeigt). Ich weiss nun nicht recht weiter und bitte daher um eure Hilfe.
Hier mal der Code meines aktuellen Versuchs:
Code: Alles auswählen
int columnCount(const QModelIndex &parent) const
{
if( parent.isValid() )
return 0;
return sourceModel()->columnCount() + 1;
}
QModelIndex index(int row, int column, const QModelIndex &parent) const
{
if( row < 0 || column < 0 )
return QModelIndex();
if( row >= rowCount( parent ) && column >= columnCount( parent ) )
return QModelIndex();
if( column < columnCount()-1 )
return QSortFilterProxyModel::index( row, column, parent );
if( !parent.isValid() )
return createIndex( row, column );
return QModelIndex();
}
QVariant data(const QModelIndex &index, int role) const
{
if( !index.isValid() )
return QVariant();
if( index.column() < columnCount()-1 )
return QSortFilterProxyModel::data( index, role );
if( role == Qt::DisplayRole )
return "Hello";
return QVariant();
}
QModelIndex mapToSource(const QModelIndex &pindex) const
{
if( pindex.isValid() && pindex.column() < columnCount()-1 )
return QSortFilterProxyModel::mapToSource( pindex );
return QModelIndex();
}Hilefoks
P.S: Der Code versucht zunächst nicht die weiter oben gezeigte Tabelle umzusetzen, sondern zunächst einfach nur eine virtuelle Spalte einzufügen. Daran scheitert es allerdings bereits.