2013-01-07 11 views
8

Ho bisogno di implementare una tabella con Qt.Come impostare i dati all'interno di un QAbstractTableModel

Credo che farò causa a QAbstractTableModel, con un QTableView che utilizza questo modello.

Capisco che dovrò modificare le funzioni rowCount(), columnCount() e data() del modello.

Tuttavia, non capisco come impostare esattamente i dati all'interno del modello, in modo che i dati function() può recuperarla ..

È la funzione setData() prevista per questo scopo? Ho visto che prende EditRole come parametro, che non voglio, in quanto non voglio che il mio tavolo sia modificabile.

Quindi, come faccio a "impostare" i dati all'interno del modello o a disporre dei dati per il modello, utilizzando la funzione data()?

Inoltre, come viene chiamata la funzione data(), cioè chi la chiama e dove dovrebbe essere chiamata?

Per favore aiutatemi.

Grazie.

+2

[questo] (http://qt-project.org/doc/qt-4.8/itemviews-addressbook.html) è un esempio. –

+0

Grazie per quello. Aiutato molto – user1173240

risposta

14

Il modo in cui i dati effettivi vengono tenuti in memoria, generati o interrogati da un archivio dati è completamente a discrezione dell'utente. Se si tratta di dati statici, è possibile utilizzare le strutture dati Qt container classes o personalizzate.

È necessario solo reimplementare il metodo setData() per i modelli modificabili.

ci sono 4 metodi necessari per implementare in maniera non modificabile QAbstractTableModel sottoclasse:

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

Questi metodi sono chiamati da la vista, di solito unoIstanza. I primi due metodi dovrebbero restituire le dimensioni della tabella. Ad esempio, se rowCount() restituisce 10 e columnCount() restituisce 4, la vista invocherà il metodo data() 40 volte (una volta per ogni cella) chiedendo i dati effettivi nelle strutture di dati interne del modello.

Come esempio, si supponga di aver implementato uno slot personalizzato retrieveDataFromMarsCuriosity() nel modello. Questo slot popola una struttura dati ed è collegato a un'istanza QPushButton, in modo da ottenere nuovi dati facendo clic su un pulsante. Ora, è necessario far sapere alla vista quando i dati vengono cambiati in modo che possa essere aggiornato correttamente. Ecco perché è necessario emettere lo beginRemoveRows(), endRemoveRows(), beginInsertRows(), endInsertRows() e le sue controparti colonna.

Il Qt Documentation ha tutto ciò che è necessario sapere su questo.

+0

Grazie mille per l'aiuto rapido. Certamente lo esaminerò. – user1173240

+0

@dschulz, è assolutamente necessario utilizzare beginInsertRows(), ecc. Per la prima inizializzazione? Quindi non capisco lo scopo di dataChanged(). Perché Qt non può recuperare le informazioni usando solo rowCount(), columnCount() e data()? Perché è necessario creare righe e colonne usando beginInsertRows(), ecc.? –

+0

@Cool_Coder sì, è necessario se si reimplementa 'insertRows()'. Devi chiamare 'beginInsertRows()' prima di aggiungere elementi al contenitore dati del tuo modello (sia esso un 'QList' o qualsiasi altra classe di container che usi). Si noti che "dati modificati" non implica necessariamente l'aggiunta o la rimozione di righe o colonne. 'dataChanged()' significa che i dati in _ articoli esistenti_ nel modello sono stati aggiornati, quindi la vista può recuperare i dati aggiornati. Pensa a cosa succede quando correggi il tuo nome in una cella 'QTableView' modificabile. – dschulz

Problemi correlati