Остановить QListView от удаления записей при перетаскивании

Я создал 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);
}

Проблема в том, что когда вы перетаскиваете элемент в списке и пытаетесь переместить его в другую позицию, он предпочитает перезаписывать элемент, на который вы перетаскиваете его. Я никогда не хочу, чтобы элемент удалялся с помощью операции перетаскивания.

1

Решение

Из документации мы получаем небольшой намек на то, где искать управление перезаписью в QListView :: dragDropOverwriteMode:

Примечание. Это не предназначено для предотвращения перезаписи элементов. модельРеализация флаги () следует сделать это, не возвращая Qt :: ItemIsDropEnabled.

Это говорит нам о том, что именно модель контролирует ее. Затем, глядя на документацию для QStringListModel :: flags (const QModelIndex & индекс) const мы видим, что он по умолчанию включает перезапись:

Повторно реализовано из QAbstractItemModel :: flags ().
Возвращает флаги для элемента с указанным индексом.
Допустимые элементы включены, доступны для выбора, редактирования, перетаскивания включены и падение включено.

Таким образом, чтобы изменить это поведение, вам нужно настроить свою модель (т.е., по крайней мере, наследовать от QStringListModel) и изменить поведение flags(const QModelIndex & index) const метод не вернуть Qt::ItemIsDropEnabled,

Это должно остановить вашу запись от перезаписи.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]