2012-08-10 14 views
13

Qt programlamada çok yeni Ben XML dosyasından alma im Qt TableView ile veri görüntülemek istiyorum.Qt TableView için bağlama modeli

Özel modelin nasıl oluşturulacağı konusunda yararlı bir eğitim bulamıyor ve bunu TableView'a bağlayamıyorum.

Lütfen biraz yardım sağlayın ya da herhangi birinin iyi örnekleri varsa lütfen paylaşın.

Teşekkür

cevap

24

Qt model görünümü yaklaşımı oldukça çok yönlüdür. Tüm modeller QAbstractItemModel'dan devralınır. Bu sınıfla oldukça karmaşık veri düzenleri oluşturabilirsiniz (listeler, ağaçlar, tablolar vb.) Ancak uygulamanın gayreti oldukça yüksektir.

Kullanıma hazır bir sınıf QStandardItemModel olacaktır. Kolayca bir tablo modeli oluşturabilir ve QStandardItem örnekleri olan öğeleri ekleyebilirsiniz. Başlamak için aşağıdaki kodu kullanabilirsiniz:

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

Gördüğünüz gibi, kullanımı gerçekten çok kolay. Ancak, bir dezavantajı, verileri QStandardItem aracılığıyla vermek zorunda olmanızdır, bu da hafıza kaybı olabilir. Örneğin, bir görünümde görüntülemek istediğiniz birkaç 100MB değeriniz olduğunu varsayalım. Zaten bir yerde saklanan verilere sahip olduğunuzdan, her hücre için bir QStandardItem oluşturmak yerine, görünümde kullanılabilmesi için sadece adapte edilmesi tercih edilir.

Bu, QAbstractTableModel'un devreye alındığı yerdir. Aşağıdaki örnek 250.000 girişli bir matrisi oluşturur. Bunun yerine, her matris elemanı için bir QStandardItem, yaratma biz QAbstractTableModel sınıfı alt ve satır, sütun ve görüntülemek için veri sayısını geri üç saf sanal yöntem numRows(), numColumns() ve data(), uygulanması. Gördüğünüz gibi

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

, model herhangi bir veri çoğaltmak ama sadece bir adaptör olarak hizmet vermektedir etmez. Daha fazla esnekliğe ihtiyacınız varsa, QAbstractItemModel ve etkinlik aracını model modellerinin oluşturulmasına, Qt'nin hangi model verilerinin okunacağını veya yazımını belirtmek için kullanabilirsiniz.

1

bunu sürekli değişen bir XML kaynağından aktif okumak mümkün ve güncelleme istediğinizden dolayı bir özel model istiyor musunuz?

Değilse, normal QTableView öğreticisini ve QStandardItemModel'u kullanabilirsiniz. XML dosyasını kendiniz ayrıştırın ve bunları modelinize ekleyerek QStandardItem nesnesi oluşturun.

Özel bir model, XML dosyasını okumayı doğrudan dışa yerleştirdiğiniz Öğeye dayalı bir yaklaşımın aksine, doğrudan modelin kendisine entegre etmenin bir yoludur.