在使用QStandardItemModel作为模型的QListView中防止重复的方法是什么?使用拖放功能添加数据。 drop,所以我试图覆盖QStandardItemModel :: dropMimeData,这似乎有点奇怪,因为我需要覆盖QStandardItemModel :: mimeData(并重新实现encodeData / decodeData)。这必须更容易!
答案 0 :(得分:0)
我能看到的最简单方法是创建自己的代理模型。
答案 1 :(得分:0)
好吧,我设法通过覆盖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);
}
}
到目前为止还不完美(例如,如果你可以同时删除多个项目),但它适用于这个简单的用例。