Hi, all!

I am using QTreeView with QAbstractItemModel-inherited model which
internally uses QSqlTableModel. I have successfully added DnD support
regarding item re-parenting. Unfortunately, data is not copied to the
destination row.

QAbstractTableModel::dropMimeData() finally calls
QAbstractItemModel::decodeData() which tries to write to the newly
created row role-data from the old row. For each index it calls
QAbstractItemModel::setItemData() which, in turn, depends on
setData().

As for QSqlTableModel, setData() has the following lines:

if (role != Qt::EditRole)
    return QSqlQueryModel::setData(index, value, role);

This means QAbstractItemModel's default implementation of setData() is
called. It always returns false, thus, making
QSqlTableModel::setData() and, as a consequence, setItemData() return
false.

This is reproducible always because of Qt::DisplayRole is also
returned in resulting QMap from QAbstractItemModel::itemData().

I am not sure, if this should be considered as a bug and which of the
mentioned methods needs to be modified in order to properly treat this
case.

Obviously, itemData() is a generic method, so it must include
Qt::DisplayRole. The same true for QSqlTableModel::setData(): it
should fail for Qt::DisplayRole. So, changes should somewhere in
between these two. I guess, setItemData() could be reimplemented in
QSqlTableModel so that it removes Qt::DisplayRole and call
QAbstractTableModel::setItemData() after that.

Regards,
Dmitrii.
_______________________________________________
Development mailing list
Development@qt-project.org
http://lists.qt-project.org/mailman/listinfo/development

Reply via email to