Próbuję zrozumieć model QAbstractItemModel i jest tam zestaw funkcji do zaimplementowania. Najbardziej interesują mnie dwie funkcje
-
index
virtual QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const = 0
-
parent
virtual QModelIndex parent(const QModelIndex &index) const = 0
Próbując zaimplementować model - napisałem taki kawałek kodu
#include "model.h"
Model::Model(QObject *parent) : QAbstractItemModel{parent}
{
mainData = new QList<QString>;
mainData->append("Dana nr 1");
mainData->append("Dana nr 2");
mainData->append("Dana nr 3");
qInfo()<< "ptr mainData in Model" << mainData;
}
Model::~Model()
{
}
int Model::rowCount(const QModelIndex &parent) const
{
quint32 row = mainData->count();
// qInfo()<< static_cast<QList<QString>*>(parent.internalPointer())->count();
return row;
}
int Model::columnCount(const QModelIndex &parent) const
{
return 1;
}
QModelIndex Model::index(int row, int column, const QModelIndex &parent) const
{
QModelIndex index = createIndex(row, column, mainData); //![1]
return index;
}
QModelIndex Model::parent(const QModelIndex &index) const //pobiera rodzica przez model
{
QModelIndex parent = createIndex(index.row(), index.column(), index.internalId());
return parent;
}
QVariant Model::data(const QModelIndex &index, int role) const
{
QVariant data;
QList<QString> *listData = static_cast<QList<QString>*>(index.internalPointer());
if(role == Qt::DisplayRole || role == Qt::EditRole){
if(index.column()==0 && index.row()==0){
data = listData->at(0);
return data;
}
if(index.column()==0 && index.row()==1){
data = listData->at(1);
return data;
}
if(index.column()==0 && index.row()==2){
data = listData->at(2);
return data;
}
}
return QVariant();
}
bool Model::setData(const QModelIndex &index, const QVariant &value, int role)
{
// if(role == Qt::DisplayRole || role == Qt::EditRole){
// qInfo()<< "role" << role;
// return true;
// }
return true;
}
QVariant Model::headerData(int section, Qt::Orientation orientation, int role) const
{
return QVariant();
}
Qt::ItemFlags Model::flags(const QModelIndex &index) const
{
Qt::ItemFlags flag;
return flag;
}
Więc pytanie jest takie
Jak zaimplementować funkcje index
i parent
wiedząc, że dane przechowuję w kontenerze QList<QString>
który jest inicjalizowany w konstruktorze ?
Częściowo doszedłem, że w metodzie index
muszę wykorzystać funkcję createIndex()
Czy ktoś mi pomoże i wyjaśni ten temat ?