Перемещение строк в QTableView+QSqlTableModel
От: purser Россия  
Дата: 23.01.17 09:58
Оценка:
В 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;
}
Отредактировано 23.01.2017 10:00 purser . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.