В QTableView можно настроить Drag and Drop таким образом, чтобы переместить строку на новую позицию.
Фактически перемещение сводится к вставке новой строки, заполнению её данными из исходной строки и удалению исходной строки.
Но удаление исходной строки не происходит (см. cut), если моделью является QSqlTableModel и d->strategy != OnManualSubmit, поскольку к моменту удаления в кеше уже
есть вставленная новая строка.
Так и не решив окончательно баг это или фича, задаюсь вопросом где фиксить эту проблему: ближе к библиотечному слою или ближе к прикладному слою?
| Код |
| bool QSqlTableModel::removeRows(int row, int count, const QModelIndex &parent)
{
Q_D(QSqlTableModel);
if (parent.isValid() || row < 0 || count <= 0)
return false;
else if (row + count > rowCount())
return false;
else if (!count)
return true;
if (d->strategy != OnManualSubmit)
if (count > 1 || (d->cache.value(row).submitted() && isDirty()))
return false;
// Iterate backwards so we don't have to worry about removed rows causing
// higher cache entries to shift downwards.
for (int idx = row + count - 1; idx >= row; --idx) {
QSqlTableModelPrivate::ModifiedRow& mrow = d->cache[idx];
if (mrow.op() == QSqlTableModelPrivate::Insert) {
revertRow(idx);
} else {
if (mrow.op() == QSqlTableModelPrivate::None)
mrow = QSqlTableModelPrivate::ModifiedRow(QSqlTableModelPrivate::Delete,
QSqlQueryModel::record(idx));
else
mrow.setOp(QSqlTableModelPrivate::Delete);
if (d->strategy == OnManualSubmit)
emit headerDataChanged(Qt::Vertical, idx, idx);
}
}
if (d->strategy != OnManualSubmit)
return submit();
return true;
}
|
| |