Много гуглил, искал решение, чего только не перепробовал. Но проблему так и не удалось решить:
На основе примера *\qt\examples\sql\querymodel\editablesqlmodel.cpp сделал редактируемую QSqlQueryModel, и прикрутил к ней QSortFilterProxyModel.
Вот кусок кода, по которому видно, что я уже перепробовал:
bool cliviewModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if (!index.column()) return false;
QModelIndex primaryKeyIndex = QSqlQueryModel::index(index.row(), 0);
int id = data(primaryKeyIndex,0).toInt();
// clear();
qDebug() << index.row() << sortingModell->mapFromSource(index).row();
bool ok=0;
QSqlQuery query;
query.prepare("UPDATE clients SET " + colums.value(index.column()) + " = ? WHERE client_id = ?");
query.addBindValue(value.toString());
query.addBindValue(id);
ok = query.exec();
if (ok) {
setQuery(lastQuery);
while (canFetchMore()) fetchMore();
// eatMouseEvent = 1;
// QMap<int, QVariant> itemData;
// itemData.insert(Qt::DisplayRole, value);
// QAbstractItemModel::setItemData(index,itemData);
// emit(dataChanged(index, index));
emit signalGoToClientById(index);
// qDebug() << setData(index, QString(tr("Исходящий")), Qt::DisplayRole);
}
return ok;
}
Задача: после редактирования ячейки обновить отображаемые данные в таблице и оставить выбранной ячейкой ту, которую мы редактировали.
Для этой цели вызываю сигнал emit signalGoToClientById(index), который соединён со слотом:
void CliView::slotGoToEdited(const QModelIndex ¤t)
{
QModelIndex cur = modell->sortingModell->mapFromSource(current);
scrollTo(cur,QAbstractItemView::EnsureVisible);
setCurrentIndex(cur);
}
Оно работает, но если я выхожу из редактирования кликом мышки, то после того как выставить нужную ячейку, курсор переходит на ту строку, куда я кликнул.
Помогите люди добрые, наверняка вы уже сталкивались с этой же проблемой..