2012-08-10 6 views
13

Im Qt 프로그래밍에서 매우 새로움 XML 파일에서 가져 오는 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 파일의 읽기를 모델 자체에 직접 통합하는 방법입니다.