[Anfängerproblem] Konstruktur TableView / TableModel

Alles rund um die Programmierung mit Qt
CBM
Beiträge: 38
Registriert: 6. Mai 2009 19:09

Beitrag von CBM »

ich muss jetzt doch nochmal den Satz von upsala aufgreifen:
rowCount(), columnCount() usw. werden natürlich 'automatisch' aufgerufen wenn du einer View dann dein Model zuweist
Wieso werden rowCount() und columnCount() aufgerufen, wenn ich meinem Model einen View zuweise? :?: rowCount() und columnCount() sind ja beide keine Konstruktoren und werden auch nicht über den Konstruktor der Basis- als auch der abgeleiteten Klasse aufgerufen.

Bei welchem Unterkapitel der Doku zum Thema Model/View Programming muss ich "nachsitzen".

Grüße
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

franzf hat mir gut verdeutlicht, dass ich auch bedenken muss, dass der Konstruktor der Basisklasse aufgerufen wird. Also sah ich hierin die einzige Möglichkeit, dass in dem Konstruktor der Basisklasse die virtuellen Funktionen rowCount() und rowColumn() aufgerufen werden.
Das würde erstens keinen Sinn ergeben und zweitens auch gar nicht funktionieren, weil bei C++ in diesem Fall nicht die Methoden der abgeleiteten Klasse (StringTableModel) sondern die der Basisklasse (QAbstractTableModel) aufgerufen würden.
Wieso werden rowCount() und columnCount() aufgerufen, wenn ich meinem Model einen View zuweise?
Angenommen, du würdest eine View (in diesem Fall eine TableView) selbst programmieren. Wenn ein Model gesetzt wird (setModel(...)) müsstest du doch alle Informationen abfragen, welche für das Zeichnen der Tabelle benötigt würden.. oder? Dazu gehören doch sicher Anzahl Zeilen, Anzahl Spalten, die Spaltentitel (Headers), die Daten der einzelnen Zellen.. halt einfach alles was der User schlussendlich sehen möchte.
Mit anderen Worten: Wie soll denn sonst eine Tabelle angezeigt werden?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Ich glaub da hakts nicht erst beim Model/View. Das sind Basics.

Ein Methodenaufruf, bei dem ein anderes Objekt übergeben wird, hat REIN GAR NIX mit einem Konstruktor zu tun

Code: Alles auswählen

MyView view;
MyMode model;
view.setModel(&model);
Zwei Konstruktoren und ein Methodenaufruf (wenn du es nicht erkennst, was wo ist, solltest du mit einer allgemeinen Einleitung zu Objektorientierter Programmierung anfangen...).

Um dir den Weg durch die Qt-Sources zu ersparen:
QTableView::setModel() setzt auch die verticalHeader und horizontalHeader neu auf, und hierbei kommt es zum wohl ersten AUfruf von row/columnCount().

Code: Alles auswählen

class QHeaderViewPrivate
{
[...]
inline int modelSectionCount() const {
        return (orientation == Qt::Horizontal
                ? model->columnCount(root)
                : model->rowCount(root));
    }
[...]
};

void QHeaderView::initializeSections()
{
    Q_D(QHeaderView);
    const int oldCount = d->sectionCount;
    const int newCount = d->modelSectionCount();
[...]
}

void QHeaderView::setModel(QAbstractItemModel *model)
{
    [...]
    initializeSections();
}

void QTableView::setModel(QAbstractItemModel *model)
{
    Q_D(QTableView);
    d->verticalHeader->setModel(model);
    d->horizontalHeader->setModel(model);
    QAbstractItemView::setModel(model);
}
Und so haben wir alles zusammen...

Grüße
Franz
Antworten