Всем привет!
Много гуглил, искал решение, чего только не перепробовал. Но проблему так и не удалось решить:
На основе примера *\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;
}
void CliView::slotGoToEdited(const QModelIndex ¤t)
{
QModelIndex cur = modell->sortingModell->mapFromSource(current);
scrollTo(cur,QAbstractItemView::EnsureVisible);
setCurrentIndex(cur);
}
Litkevich Yuriy, за SelectionModel спасибо. Хоть мне и не нужно многостроковое выделение, зато с помощью QItemSelectionModel теперь могу выделять строку прямо из класса модели, без сигналов.
Вот только всё равно это не решило проблему.
QItemSelectionModel, setCurrentIndex() и selectRow() дают тот же результат (в моём случае).
Делаю вот так:
void MyQTableView::currentChanged(const QModelIndex ¤t, const QModelIndex &previous)
{
if (current.row() == previous.row()||current.row() == -1) return;
qDebug() << "currentChanged" << current.row();
QAbstractItemView::currentChanged(current, previous);
}
bool MyQSqlQueryModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if (!index.column()) return false;
if (role != Qt::EditRole) return true;
QModelIndex primaryKeyIndex = QSqlQueryModel::index(index.row(), 0);
int id = data(primaryKeyIndex).toInt();
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) {
qDebug() << "setData" << index.row();
setQuery(lastQuery);
while (canFetchMore()) fetchMore();
selectionMode1->setCurrentIndex(QSqlQueryModel::index(800,0),QItemSelectionModel::Select);
}
return ok;
}
currentChanged 54 // двойной клик на строку 54
setData 54 // редактирование
currentChanged 800 // выход из редактирования по клику на любой другой ячейке. перешли на строку 800
currentChanged 784 // почему ???!! кажется сработал мой клик при выходе из редактирования.. как блокировать??
currentChanged 843 // двойной клик на строку 843
setData 843 // редактирование
currentChanged 800 // выход из редактирования по клику на любой другой ячейке. перешли на строку 800
currentChanged 799 // ну вот, опять! это число зависит от того, в какую область я щёлкнул..
currentChanged 853 // ну, и т.д..
setData 853
currentChanged 800
currentChanged 786
Уф.. У меня получилось!!
Полторы недели мучений, а оказывается всё было так просто!!
Решение:
Нельзя обновлять модель в setData() через повторное setQuery! Обновлять нужно так: this->query().exec();
И никто мне не подсказал....
=(
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)