QListView& QStandardItemModel - 防止重复

时间:2011-03-06 23:29:02

标签: qt

在使用QStandardItemModel作为模型的QListView中防止重复的方法是什么?使用拖放功能添加数据。 drop,所以我试图覆盖QStandardItemModel :: dropMimeData,这似乎有点奇怪,因为我需要覆盖QStandardItemModel :: mimeData(并重新实现encodeData / decodeData)。这必须更容易!

2 个答案:

答案 0 :(得分:0)

我能看到的最简单方法是创建自己的代理模型。

请参阅http://doc.qt.io/qt-5/qabstractproxymodel.html

答案 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);
    }
}

到目前为止还不完美(例如,如果你可以同时删除多个项目),但它适用于这个简单的用例。