Я знаю, что подобные вопросы задавали тысячи раз, но я не смог найти подходящего решения.Может быть, я просто не правильно понял.
У меня есть QTableView
с пользовательскими QAbstractTableModel
.Модель имеет повторно реализованные функции-члены:
columnCount
rowCount
data
flags
moveRows
supportedDropActions
supportedDragActions
QTableView
Настройки:
setDragEnabled(true)
setDragDropOverwriteMode(false)
setDragDropMode(QAbstractItemView::InternalMove)
setDefaultDropAction(Qt::MoveAction)
setSelectionMode(QAbstractItemView::ExtendedSelection)
setSelectionBehavior(QAbstractItemView::SelectRows)
Я хочу иметь возможность изменять порядок строк как в QTableView
, так и в базовой модели с помощью перетаскивания.Более того, эти шаги не должны удалять и вставлять в модель, потому что базовые данные не должны быть удалены вообще, только переупорядочены.Вместо этого при выпадении события QTableView
вызывает removeRows
для модели и ничего более.moveRows
никогда не вызывал и даже insertRows
(хотя я не хочу, чтобы он был удален и вставлен, я хочу, чтобы он был перемещен ).
Я думал, что QTableView
следует просто вызвать moveRows
для базовой модели, но по некоторым причинам он вызывает removeRows
, несмотря на то, что для dragDropMode
установлено значение InternalMove
и defaultDropAction
для MoveAction
.Это выглядит странно на мой взгляд.
Как я могу (если вообще) заставить QTableView
просто переместить желаемую строку в модели?И почему он вызывает removeRows
, если удаление не требуется?Какие вызовы базовой модели выполняются QTableView
, когда перетаскивание происходит в режиме InternalMove
, и как я могу правильно изменить это поведение?Должен ли я подкласс QTableView
?Если да, то какие функции-члены мне следует повторно реализовать?
Относительно MIME-типов: мне не нужно перетаскивать эти данные за пределы виджета, только внутреннее переупорядочение.Поэтому я думаю, что мне также не нужны MIME-типы.