Я создал QListView с QStringListModel.
listModel = new QStringListModel(ui->listView);
ui->listView->setModel(listModel);
ui->listView->setEditTriggers(QListView::NoEditTriggers);
ui->listView->setDragDropMode(QListView::InternalMove);
И я добавляю элементы, используя:
void MainWindow::addItem(QString result)
{
if (result == "")
return;
listModel->insertRow(listModel->rowCount());
QModelIndex a = listModel->index(listModel->rowCount()-1);
listModel->setData(a,result);
}
Проблема в том, что когда вы перетаскиваете элемент в списке и пытаетесь переместить его в другую позицию, он предпочитает перезаписывать элемент, на который вы перетаскиваете его. Я никогда не хочу, чтобы элемент удалялся с помощью операции перетаскивания.
Из документации мы получаем небольшой намек на то, где искать управление перезаписью в QListView :: dragDropOverwriteMode:
Примечание. Это не предназначено для предотвращения перезаписи элементов. модельРеализация флаги () следует сделать это, не возвращая Qt :: ItemIsDropEnabled.
Это говорит нам о том, что именно модель контролирует ее. Затем, глядя на документацию для QStringListModel :: flags (const QModelIndex & индекс) const мы видим, что он по умолчанию включает перезапись:
Повторно реализовано из QAbstractItemModel :: flags ().
Возвращает флаги для элемента с указанным индексом.
Допустимые элементы включены, доступны для выбора, редактирования, перетаскивания включены и падение включено.
Таким образом, чтобы изменить это поведение, вам нужно настроить свою модель (т.е., по крайней мере, наследовать от QStringListModel) и изменить поведение flags(const QModelIndex & index) const
метод не вернуть Qt::ItemIsDropEnabled
,
Это должно остановить вашу запись от перезаписи.
Других решений пока нет …