Что ж, мне удалось решить эту проблему путем переопределения QListView :: dataChanged, который проверяет, существует ли более одного элемента с одинаковыми данными для Qt :: DisplayRole в модели после удаления, и удаляет один из них, если он есть. В основном это выглядит так:
void MyListView::dataChanged(QModelIndex topLeft, QModelIndex bottomRight)
{
// there can be only one item dragged at once in my use case
if(topLeft == bottomRight)
{
QStandardItemModel* m = static_cast<QStandardItemModel*>(model());
// if theres already another item with the same DisplayRole...
if(m->findItems(topLeft.data().toString()).count() > 1)
{
// ... we get rid of it.
model()->removeRow(topLeft.row());
}
}
else
{
// let QListView decide
QListView::dataChanged(topLeft, bottomRight);
}
}
Это далеко не идеально (например, если вы можете выбросить более одного предмета одновременно), но это работает для этого простого варианта использования.