QListView & QStandardItemModel - предотвращение дублирования - PullRequest
0 голосов
/ 07 марта 2011

Как можно избежать дубликатов в QListView, который использует QStandardItemModel в качестве своей модели?Данные добавляются методом перетаскивания, поэтому я попытался переопределить QStandardItemModel :: dropMimeData, что кажется странным, поскольку мне нужно переопределить QStandardItemModel :: mimeData (и переопределить encodeData / decodeData).Это должно быть проще!

Ответы [ 2 ]

0 голосов
/ 01 апреля 2011

Что ж, мне удалось решить эту проблему путем переопределения 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);
    }
}

Это далеко не идеально (например, если вы можете выбросить более одного предмета одновременно), но это работает для этого простого варианта использования.

0 голосов
/ 07 марта 2011

Самый простой способ, который я вижу, - создать собственную модель прокси.

См. http://doc.qt.io/qt-5/qabstractproxymodel.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...