Próbuję zrozumieć jak działają modele w Qt i chcę zrobić własny model - wiem, że jest QTableWidget do płaskiego modelu danych i w sobie wszystko ma... ale są sytuacje gdzie wbudowany gotowiec nie spełnia wszystkich oczekiwań (nie przytoczę jakich, bo nie mam na tyle doświadczenia, żeby się tutaj wypowiedzieć). Więc próbuję zrobić swój model. Wziąłem na warsztat klasę QAbstractItemModel zrobiłem własną podklasę i w związku z tym mam kilka pytań.
te dwie funkcje są oczywiste...
int MyModel2::columnCount(const QModelIndex &/*parent*/) const
{
return 5;
}
int MyModel2::rowCount(const QModelIndex &/*parent*/) const
{
return 2;
}
natomiast chciałbym się dowiedzieć następujących rzeczy o funkcjach:
- czy ciało funkcji
index
jest wystarczające ? Bo z tego co rozumiem z dokumentacji, to w tej funkcji należy ustawić wskaźnikQModelIndex
na index w modelu aby można było w ogóle ustawiać dane i je odczytywać. Czy to co zrobiłem jest prawidłowe ? Czy to już wszystko, jeżeli chodzi o ciało tej funkcji ? Co ze zmiennąparent
dla płaskiego modelu danych ?
QModelIndex MyModel2::index(int row, int column, const QModelIndex &/*parent*/) const
{
QModelIndex idx;
idx=createIndex(row,column);
return idx;
}
- funkcja
parent
- co może być "rodzicem" dla płaskiego modelu danych ? W dokumentacji doczytałem się, że do płaskiego modelu danych można wykorzystać QAbstractItemModel::checkIndex ale jak to użyć ? i co nam to daje ? Nieprawidłowy index ?
QModelIndex MyModel2::parent(const QModelIndex &/*index*/) const
{
return QModelIndex();
}
- funkcja
setData
(ustawia dane w modelu) czy to co zrobiłem poniżej jest poprawne ? Jak załadować dane do modelu za pomocą tej funkcji ? np macierz z pliku (pomijam obsługę plików bo to umiem ale bardziej chodzi mi o to, jak tej funkcji "pokazać" co ma załadować i gdzie)
bool MyModel2::setData(const QModelIndex &index, const QVariant &value, int role)
{
int w=-1, k=-1;
w=index.row();
k=index.column();
if(role==Qt::EditRole){
if(!checkIndex(index)){
// qDebug()<<"index"<<false;
return false;
}
else if(w!=-1 && k!=-1){
qDebug()<<w<<" "<<k;
value.toString();
}
// qDebug()<<"if"<<true;
return true;
}
return false;
}
- funkcja
data
(ustawia dane w widoku) - niby coś się ustawia ale jak ustawić dane w konkretnym wierszu i konkretnej kolumnie ? Np user kliknie wiersz 100 kolumna 1029 i jak to obsłużyć ? Wiem, że za pomocą pętli ale jak ? Bo bez sensu jest pisać
if(index.row()==0 && index.column()==0)
return data;
QVariant MyModel2::data(const QModelIndex &index, int role) const
{
int w=-1, k=-1;
w=index.row();
k=index.column();
QVariant data="test";
QVariant data2="test 2";
if(/*role==Qt::CheckStateRole || */role==Qt::DisplayRole || role==Qt::TextAlignmentRole){
if(w!=-1 && k!=-1){
return data;
}
}
return QVariant();
}
no dobra, ale jak nada się treść tych funkcji, to jak ich używać ? Czy one inteligentnie same ustawiają dane ? czy trzeba je po prostu wywołać z parametrami ?
jest jeszcze jedna zagadka
ten kwadracik do zaznaczenia, wiem, że jest rola
role==Qt::CheckStateRole
ale to działa programowo. Jak tego skubańca można obsłużyć aby za pomocą myszki się zaznaczał i zwracał swój stan ?
Może dziwne mam pytania ale nie za bardzo to rozumiem i chciałbym prosić o wyjaśnienie.