2013-01-07 6 views
8

Ich muss eine Tabelle mit Qt implementieren.So legen Sie Daten in einem QAbstractTableModel fest

Ich glaube, ich werde ein QAbstractTableModel verurteilen, mit einem QTableView mit diesem Modell.

Ich verstehe, ich muss die Funktionen rowCount(), columnCount() und data() des Modells bearbeiten.

Allerdings verstehe ich nicht, wie genau die Daten im Modell festgelegt, so dass die Daten() Funktion, die sie abrufen kann ..

Ist setData() Funktion für diesen Zweck zur Verfügung gestellt? Ich habe gesehen, dass EditRole als Parameter verwendet wird, was ich nicht möchte, da ich nicht möchte, dass meine Tabelle editierbar ist.

Also, wie "setze" ich Daten innerhalb des Modells, oder habe Daten für das Modell zu bekommen, mit der Funktion data()?

Wie wird die data() - Funktion aufgerufen, d. H. Wer ruft sie an und wo müsste sie aufgerufen werden?

Bitte helfen Sie mir dabei.

Danke.

+2

[This] (http://qt-project.org/doc/qt-4.8/itemviews-addressbook.html) ist ein Beispiel. –

+0

Danke dafür. Hat viel geholfen. – user1173240

Antwort

14

Wie die tatsächlichen Daten im Speicher gehalten, generiert oder abgefragt werden, liegt ganz bei Ihnen. Wenn es sich um statische Daten handelt, können Sie die Qt container classes oder benutzerdefinierte Datenstrukturen verwenden.

Sie müssen die Methode setData() nur für bearbeitbare Modelle neu implementieren.

Es gibt 4 Methoden, die Sie brauchen, in einem nicht bearbeitbaren QAbstractTableModel Unterklasse zu implementieren:

  • int rowCount()
  • int columnCount()
  • QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole)
  • QVariant data(const QModelIndex & index, int role = Qt::DisplayRole)

Diese Methoden aufgerufen werden aus die Aussicht, normalerweise eine QTableView Instanz. Die ersten beiden Methoden sollten die Dimensionen der Tabelle zurückgeben. Wenn beispielsweise rowCount()10 zurückgibt und columnCount()4 zurückgibt, ruft die Ansicht 40 Mal (einmal für jede Zelle) die Methode data() auf, um nach den tatsächlichen Daten in den internen Datenstrukturen Ihres Modells zu fragen.

Angenommen, Sie haben in Ihrem Modell einen benutzerdefinierten Steckplatz retrieveDataFromMarsCuriosity() implementiert. Dieser Steckplatz füllt eine Datenstruktur und ist mit einer QPushButton Instanz verbunden, sodass Sie durch Klicken auf eine Schaltfläche neue Daten erhalten. Jetzt müssen Sie die Ansicht wissen lassen, wenn die Daten geändert werden, damit sie ordnungsgemäß aktualisiert werden kann. Deshalb müssen Sie die beginRemoveRows(), endRemoveRows(), beginInsertRows(), endInsertRows() und ihre Spaltengegenstücke ausgeben.

Die Qt Documentation hat alles, was Sie darüber wissen müssen.

+0

Vielen Dank für Ihre schnelle Hilfe. Ich werde mich sicherlich darum kümmern. – user1173240

+0

@dschulz, muss unbedingt beginInsertRows(), etc für die erste Initialisierung verwendet werden? Dann verstehe ich nicht den Zweck von DataChanged(). Warum kann Qt die Informationen nicht nur mit rowCount(), columnCount() & data() abrufen? Warum müssen Zeilen und Spalten mit beginInsertRows() usw. erstellt werden? –

+0

@Cool_Coder Ja, es ist notwendig, wenn Sie 'insertRows()' neu implementieren. Sie müssen 'beginInsertRows()' aufrufen, bevor Sie dem Datencontainer Ihres Modells Elemente hinzufügen (sei es eine 'QList' oder eine von Ihnen verwendete Containerklasse). Beachten Sie, dass "Daten geändert" nicht unbedingt bedeutet, dass Zeilen oder Spalten hinzugefügt oder entfernt werden. 'dataChanged()' bedeutet, dass Daten in _existing items_ im Modell aktualisiert wurden, sodass die Ansicht diese aktualisierten Daten abrufen kann. Denken Sie nur darüber nach, was passiert, wenn Sie Ihren Namen in einer editierbaren 'QTableView'-Zelle korrigieren. – dschulz

Verwandte Themen