ProxyModel und virtuelle Spalte

Alles rund um die Programmierung mit Qt
Antworten
hilefoks
Beiträge: 144
Registriert: 13. März 2008 16:09

ProxyModel und virtuelle Spalte

Beitrag von hilefoks »

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.

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 Euro
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:

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();
}
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.
Antworten