2012-08-10 8 views
13

Im molto nuovo nella programmazione Qt Voglio visualizzare i dati con Qt TableView che provengono dal file XML.Modello di rilegatura a Qt TableView

non riesco a trovare alcun utile tutorial su come creare il modello personalizzato e quindi associarlo a Tableview.

Si prega di fornire un aiuto o se qualcuno ha alcuni buoni esempi si prega di condividere.

Grazie

risposta

24

L'approccio della vista del modello in Qt è piuttosto versatile. Tutti i modelli ereditano da QAbstractItemModel. Con questa classe è possibile creare layout di dati piuttosto complessi (elenchi, alberi, tabelle, ecc.) Ma lo sforzo per l'implementazione è anche piuttosto elevato.

Un pronto per l'uso di classe sarebbe QStandardItemModel. È possibile creare facilmente un modello di tabella e aggiungere gli elementi, che sono istanze di QStandardItem. È possibile utilizzare il seguente codice per iniziare:

#include <QtGui> 

QStandardItemModel* createModel(QObject* parent) 
{ 
    const int numRows = 10; 
    const int numColumns = 10; 

    QStandardItemModel* model = new QStandardItemModel(numRows, numColumns); 
    for (int row = 0; row < numRows; ++row) 
    { 
     for (int column = 0; column < numColumns; ++column) 
     { 
      QString text = QString('A' + row) + QString::number(column + 1); 
      QStandardItem* item = new QStandardItem(text); 
      model->setItem(row, column, item); 
     } 
    } 

    return model; 
} 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 

    QMainWindow window; 
    QTableView* view = new QTableView; 
    view->setModel(createModel(view)); 
    window.setCentralWidget(view); 
    window.show(); 

    return app.exec(); 
} 

Vedete, è davvero facile da usare. Tuttavia, uno svantaggio è che devi fornire i dati tramite uno QStandardItem, che potrebbe essere uno spreco di memoria. Ad esempio, si supponga di avere diversi 100 MB di dati, che si desidera visualizzare in una vista. Poiché i dati sono già memorizzati in qualche luogo, sarebbe preferibile adattarli in modo tale da poterli utilizzare nella vista invece di creare uno QStandardItem per ogni cella.

È qui che entra in gioco QAbstractTableModel. L'esempio seguente crea una matrice con 250.000 voci. Invece di creare una QStandardItem per ogni elemento della matrice, abbiamo sottoclasse QAbstractTableModel e implementare i tre metodi virtuali puri numRows(), numColumns() e data(), che restituiscono il numero di righe, colonne e i dati da visualizzare.

#include <QtGui> 

class MatrixModel : public QAbstractTableModel 
{ 
public: 
    MatrixModel(int numRows, int numColumns, double* data) 
     : m_numRows(numRows), 
      m_numColumns(numColumns), 
      m_data(data) 
    { 
    } 

    int rowCount(const QModelIndex& parent = QModelIndex()) const 
    { 
     return m_numRows; 
    } 

    int columnCount(const QModelIndex& parent = QModelIndex()) const 
    { 
     return m_numColumns; 
    } 

    QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const 
    { 
     if (!index.isValid() || role != Qt::DisplayRole) 
      return QVariant(); 

     // Return the data to which index points. 
     return m_data[index.row() * m_numColumns + index.column()]; 
    } 

private: 
    int m_numRows; 
    int m_numColumns; 
    double* m_data; 
}; 


int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 

    // Create a matrix. 
    const int numRows = 500; 
    const int numColumns = 500; 
    double matrix[numRows][numColumns]; 
    for (int i = 0; i < numRows; ++i) 
     for (int j = 0; j < numColumns; ++j) 
      matrix[i][j] = i + j; 

    // Create a model which adapts the data (the matrix) to the view. 
    MatrixModel model(numRows, numColumns, (double*)matrix); 

    QMainWindow window; 
    QTableView* view = new QTableView; 
    view->setModel(&model); 
    window.setCentralWidget(view); 
    window.show(); 

    return app.exec(); 
} 

Come si può vedere, il modello non duplicare tutti i dati, ma serve solo come un adattatore. Se è necessaria una flessibilità ancora maggiore, è possibile passare a QAbstractItemModel e all'evento evento la creazione degli indici modello, che Qt utilizza per specificare quali dati del modello leggere o scrivere.

1

Vuoi un modello personalizzato perché si vuole che sia in grado di leggere in modo attivo e aggiornamento da un sorgente XML in continua evoluzione?

In caso contrario, si può semplicemente utilizzare un normale esercitazione QTableView e QStandardItemModel. Analizza tu stesso il file XML e crea gli oggetti QStandardItem, aggiungendoli nel tuo modello.

Un modello personalizzato è un modo per integrare la lettura del file XML direttamente nel modello stesso, al contrario di un approccio Item-based in cui si popolano esternamente.