Witam,
głównie mam problem z uaktualnianiem danych w QTableView wykorzytując do tego własny model danych dziedziączący po QStandardItemModel.
Pierwszy raz muszę tworzyć własny model danych, gdyż dotychczas korzystałem np. z QSqlQueryModel lub QSqlTableModel i z tego co się na ten temat dowiedziałem, w celu przygotowania własnego modelu należy nadpisać wirtualne metody setData() i flags(), Dodatkowo w przypadku uaktualniania danych w QTableView należy wykorzystać sygnał datachanged().. (i to ten aspekt stanowi u mnie problem ponieważ sama edycja danych jako tako działa..)
Mój kod (część) wygląda następująco:
Qt::ItemFlags NewTestModel::flags(const QModelIndex &index) const
{
Qt::ItemFlags flags = QStandardItemModel::flags(index);
if (index.column() == 5)
{
flags |= Qt::ItemIsEditable;
return flags;
}
return QAbstractItemModel::flags(index);
}
bool NewTestModel::setData(const QModelIndex &index, const QVariant &value, int /* role */)
{
if(index.column() != 5)
return false;
QModelIndex ctResultIndex = NewTestModel::index(index.row(), 4);
int result_id = data(ctResultIndex).toInt();
bool ok;
if (index.column() == 5) {
QModelIndex top= createIndex(index.row(),index.column());
ok = setTotalValue(result_id, value.toString());
if(ok)
{
//tutaj robiłem różne kombinacje..
//emit dataChanged(index, index);
QAbstractItemModel::emit dataChanged(top, top);
}
//emit signalrepaint(row,col); //kolejna próba obejścia problemu..
qDebug() << "---------------";
qDebug() << "value: " << value.toString();
qDebug() << "result_id: " << result_id;
qDebug() << "column: " << index.column();
qDebug() << "row: " << index.row();
}
return ok;
}
Ogólnie przejrzałem kilkadziesiąt stron/przykładów z sieci, jak powinno wyglądać rozwiązanie tej aktualizacji i wydaje mi się, że mam to zrobione poprawnie..(a jednak to nie działa :P więc musi czegoś brakować..).
Próbowałem obejść jakoś ten problem i znalazłem "jakieś" rozwiązanie, tylko wydaje mi się ono mało zgodne ze sztuką.. Przy pierwszym tworzeniu modelu dane są do niego dodawane z wykorzystaniem metody setItem: __resultsModel->setItem(i, k, new QStandardItem(res.value(k).toString()));__
Z racji tego początkowo emitowałem sygnał __signalrepaint()__
który napany przez slot umożliwiał "odświeżanie" modelu -- tworzył go ponownie od zera. To w tej chwili zdaje egzamin, ale czy dla większej ilości danych (np. macierzy 5000x15) to zda egzamin? (nie "przytnie" to aplikacji ?)
Ale to nie wszystko.. Jak widać powyżej ostatecznie emitowałem sygnał o postaci: __signalrepaint(row,col);__
Chciałem w ten sposób przekazać tylko informacje w jakiej komórce wiersza należy dokonać edycji danych i następnie wykonać uaktualnienie. Jednak poniższy kod nie działa poprawnie (nie powoduje żadnych zmian... pewnie czegoś brakuje...):
void NewTable::UpdateData(const QModelIndex & indexA, const QModelIndex & indexB)
{
qDebug() << "różne kombinowanie..";
int col = indexA.column();
int fila = indexA.row();
qDebug() << "col:" << col;
qDebug() << "row" << row;
//int valor1 = 1;
//qDebug() << "valor1" << valor1;
//resultsTV->model()->setData(resultsTV->model()->index(row,col),valor1+10);
if(col == 1 || col == 5)
{
int valor1 = resultsTV->model()->data(resultsTV->model()->index(row,4)).toInt();
int valor2 = resultsTV->model()->data(resultsTV->model()->index(row,5)).toInt();
qDebug() << "****^^^^****";
qDebug() << "valor1: " << valor1;
qDebug() << "valor2: " << valor2;
resultsTV->model()->setData(resultsTV->model()->index(row,col+1),1*valor1);
//resultsTV->model()->setData(resultsTV->model()->index(row,col + 2),(20*valor1/valor2));
}
}
Podsumowując:: czekam na jakiekolwiek sugestie/rozwiązania powyżej przedstawionego problemu.