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.