2012-08-10 83 views
13

在Qt編程中我非常新,我想用從Qt獲取的Qt TableView顯示數據。綁定模型到Qt TableView

我找不到有關如何創建自定義模型,然後將其綁定到TableView的任何有用的教程。

請提供一些幫助,如果有人有一些很好的例子,請分享。

感謝

回答

24

Qt中的模型視圖方法非常靈活。所有型號都從QAbstractItemModel繼承。通過這個類,你可以創建相當複雜的數據佈局(列表,樹,表等),但實現的努力也相當高。

準備使用類將是QStandardItemModel。您可以輕鬆創建表格模型並添加項目,這些項目是QStandardItem的實例。你可以使用下面的代碼開始:

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

你看,它真的很容易使用。但是,缺點是您必須通過QStandardItem來提供數據,這可能會浪費內存。例如,假設您有幾個100MB的數據,您希望在視圖中顯示。由於您已將數據存儲在某個位置,因此最好將其適配爲使其可用於視圖中,而不是爲每個單元創建QStandardItem

這是QAbstractTableModel發揮作用。以下示例創建一個包含250.000個條目的矩陣 。而不是創建一個QStandardItem每矩陣元件, 的我們的子類QAbstractTableModel和實現三個純虛擬方法 numRows()numColumns()data(),其返回的行,列和 以顯示數據的數量。

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

正如您所看到的,該模型不會複製任何數據,只是用作適配器。如果你需要更大的靈活性,你可以去QAbstractItemModel和事件執行 創建模型索引,Qt用它來指定要讀取的模型數據或寫入的數據。

1

你想自定義模式,因爲你希望它能夠積極讀取和更新從不斷變化的XML源?

如果不是,您可以簡單地使用任何普通的QTableView教程和QStandardItemModel。自己解析XML文件並創建QStandardItem對象,將它們添加到模型中。

自定義模型是一種將XML文件的讀取直接集成到模型本身的方法,而不是基於項目的方法,您可以在外部對其進行填充。